![](/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.