所以......我有: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);
}
我的问题是:
我们可以减少步数吗? 是否有更聪明/更短的方式,没有其他数据结构。
感谢。
答案 0 :(得分:5)
有更智能/更短的方式吗?
如果您想要更短,使用Java 8,您可以使用整数流:
int min = Arrays.stream(array).filter(i -> i >= 0).min().orElse(0);
(假设你对数组为空时的最小值为0感到满意。)
答案 1 :(得分:3)
没有任何知识,就无法避免迭代整个数组。
但是,您可以确保通过删除第一个循环仅迭代一次,而只是分配smallest = Integer.MAX_VALUE
。您还可以添加一个布尔值,指示数组已更改,以区分没有正整数的情况,以及唯一正整数为Integer.MAX_VALUE
的情况
答案 2 :(得分:3)
您不需要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
答案 3 :(得分:1)
为此目的,您不需要两个循环。
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且剩余是非正数。如果您认为可能出现这种情况,则应添加控件。
答案 4 :(得分:0)
为您准备的样本:
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);
答案 5 :(得分:0)
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);
}
答案 6 :(得分:0)
您可以尝试使用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
答案 7 :(得分:0)
您可以尝试以下代码
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);
}
}
答案 8 :(得分:0)
对于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;
}
答案 9 :(得分:0)
在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);
答案 10 :(得分:0)
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;
}
}
}