![](/img/trans.png)
[英]Trying to find the smallest positive number that is evenly divisible by all of the numbers from 1 to 20
[英]find smallest positive number in an array
所以......我有:int array [] = {-8,2,0,5,-3,6,0,9};
我想找到最小的正數(在上面的列表中是2)
這就是我在做的事情:
int array[] = {-8,2,0,5,-3,6,0,9};
int smallest=0;
for(int i=0;i<array.length;i++) // Find the first number in array>0 (as initial
// value for int smallest)
{
if(array[i]>0)
{
smallest=array[i];
break;// Break out of loop, when you find the first number >0
}
}
for(int i=0;i<array.length;i++) // Loop to find the smallest number in array[]
{
if(smallest>array[i]&&array[i]>0)
{
smallest=array[i];
}
}
System.out.println(smallest);
}
我的問題是:
我們可以減少步驟數嗎? 是否有更聰明/更短的方式,沒有其他數據結構。
謝謝。
這有更聰明/更短的方式嗎?
如果你想要更短,使用Java 8,你可以使用一個int流:
int min = Arrays.stream(array).filter(i -> i >= 0).min().orElse(0);
(假設你對數組為空時的最小值為0感到滿意)。
沒有任何prioe知識,沒有辦法避免迭代整個數組。
但是,您可以確保通過刪除第一個循環僅迭代一次,而只是分配smallest = Integer.MAX_VALUE
。 您還可以添加一個布爾值,指示數組已更改以區分沒有正整數的情況,以及唯一正整數為Integer.MAX_VALUE
您不需要具有smallest=array[i]
,只需使用INTEGER.MAX_VALUE
或array[0]
初始化變量,並迭代數組,將值與此變量進行比較。
這是在O(n)時間和O(1)空間中實現的 ,這是你能得到的最好的! :)
一種更簡單的方法
int[] array ={-1, 2, 1};
boolean max_val_present = false;
int min = Integer.MAX_VALUE;
for(int i=0;i<array.length;i++) // Loop to find the smallest number in array[]
{
if(min > array[i] && array[i] > 0)
min=array[i];
//Edge Case, if all numbers are negative and a MAX value is present
if(array[i] == Integer.MAX_VALUE)
max_val_present = true;
}
if(min == Integer.MAX_VALUE && !max_val_present)
//no positive value found and Integer.MAX_VALUE
//is also not present, return -1 as indicator
return -1;
return min; //return min positive if -1 is not returned
為此,您不需要兩個循環。
int smallest = Integer.MAX_VALUE;
for(int i=0;i<array.length;i++) {
if(array[i] > 0 && smallest > array[i])
{
smallest = array[i];
}
}
此代碼的唯一問題是在循環之后,您無法知道所有元素是否為非正數或至少其中一個是Integer.MAX_INT且剩余是非正數。 如果您認為可能出現這種情況,則應添加控件。
給你的樣品:
int array[] = {-8,2,0,5,-3,6,0,9};
int minPosNum = Integer.MAX_VALUE;
for (int i = 0; i < array.length; i++) {
if(array[i] > 0 && array[i] < minPosNum){
minPosNum = array[i];
}
}
System.out.println(minPosNum);
int array[] = {-8,2,0,5,-3,6,0,9};
int minPos = Integer.MAX_VALUE;
for (int number : array) {
if (number > 0)
minPos = Math.min(number, minPos);
}
您可以嘗試使用1循環執行此操作:
int array[] = {8,2,0,5,-3,6,0,9};
int smallestPositive = array[0];
for(int i = 1; i < array.length; i++){
if(smallestPositive > 0){
if(array[i] < smallestPositive && array[i] > 0)
smallestPositive = array[i];
}else
smallestPositive = array[i];
}
System.out.println(smallestPositive);
將打印2
您可以嘗試以下代碼
import java.util.*;
public class SmallItem
{
public static void main(String args[])
{
int array[] = {-8,2,0,5,-3,6,0,9};
int number = Integer.MAX_VALUE;
ArrayList al = new ArrayList();
//Here we add all positive items into a ArrayList al
for(int i=1;i<array.length;i++){
if(array[i]>0){
al.add(new Integer(array[i]));
}
}
Iterator it = al.iterator();
while(it.hasNext()){
int n = ((Integer)it.next()).intValue();
if(n<number){
number = n;
}
}
System.out.println("Smallest number : " + number);
}
}
對於C ++
int smallest (int array[]){
int a;
for(int i=0;i<n;i++){
if(array[i]>0){
a=array[i];
break;
}
}
for (int i=0; i<n; i++){
if(array[i]<=a && array[i]>0){
a=array[i];
}
}
return a;
}
在JavaScript中
var inputArray = [-1,2,1,5,-20];
var arrayWithOnlyPositiveValue = [];
for(var i=0;i<inputArray.length;i++){
if(inputArray[i]>=0){
arrayWithOnlyPositiveValue.push(inputArray[i])
}
}
var min_of_array = Math.min.apply(Math, arrayWithOnlyPositiveValue);
console.log('---smallestPositiveValue----',min_of_array);
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
int[] array = { -1, 2, 1, -2, 11, 23, 44 };
int min = MinArray(array);
Console.WriteLine(min.ToString() + " is the minimum number!");
Console.ReadKey();
}
public static int MinArray(int[] array)
{
int minimumNumber = Int32.MaxValue;
foreach (int i in array)
{
if (i < minimumNumber && i > 0)
{
minimumNumber = i;
}
}
return minimumNumber;
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.