查找最接近的数字为0

时间:2014-05-20 13:19:18

标签: java

我正在尝试用Java解决程序问题。

要求:需要在数组中找到最接近零的值。在数组中,如果值类似于1和-1,则最接近的值应为正值。

public class CloseToZero {    
    public static void main(String[] args) {    
        int[] data = {2,3,-2};    
        int curr = 0;    
        int near = data[0];     
        // find the element nearest to zero    
        for ( int i=0; i < data.length; i++ ){    
            curr = data[i] * data[i];     
            if ( curr <= (near * near) )  {     
                near = data[i]; 
            }     
        }    
        System.out.println( near );    
    }    
}

21 个答案:

答案 0 :(得分:9)

这将在O(n)时间内完成:

int[] arr = {1,4,5,6,7,-1};

int closestIndex = 0;
int diff = Integer.MAX_VALUE;
for (int i = 0; i < arr.length; ++i) {
    int abs = Math.abs(arr[i]);
    if (abs < diff) {
        closestIndex = i;
        diff = abs;
    } else if (abs == diff && arr[i] > 0 && arr[closestIndex] < 0) {
        //same distance to zero but positive 
        closestIndex =i;
    }
}   
System.out.println(arr[closestIndex ]);

答案 1 :(得分:3)

对数组进行排序(添加一行代码),这样,如果为具有相同距离的正数和负数选择相同的绝对值,则拾取的最后一个数字将为正数。

import java.util.Arrays;

public class CloseToZero {

    public static void main(String[] args) {

        int[] data = {2,3,-2};
        int curr = 0;
        int near = data[0]; 
        Arrays.sort(data);      //  add this
        System.out.println(Arrays.toString(data));        
        // find the element nearest to zero
        for ( int i=0; i < data.length; i++ ){
            System.out.println("dist from " + data[i] + " = " + Math.abs(0 -data[i]));
            curr = data[i] * data[i]; 
            if ( curr <= (near * near) )  { 
                near = data[i];
            } 
        }
        System.out.println( near );
    }

答案 2 :(得分:2)

如果您使用的是java8:

import static java.lang.Math.abs;
import static java.lang.Math.max;

public class CloseToZero {
    public static void main(String[] args) {
        int[] str = {2,3,-2};
        Arrays.stream(str).filter(i -> i != 0)
                .reduce((a, b) -> abs(a) < abs(b) ? a : (abs(a) == abs(b) ? max(a, b) : b))
                .ifPresent(System.out::println);
    }
}

答案 3 :(得分:1)

只需在此列表中添加零。

然后对列表进行排序

Arrays.sort(data);

然后在零之前或之后获取数字并选择大于零的最小值

答案 4 :(得分:1)

 static int Solve(int N, int[] A){
      int min = A[0];
      for (int i=1; i<N ; i++){
        min = min > Math.abs(0- A[i]) ? Math.abs(0- A[i]) : Math.abs(min);
      }
      return min;
    }

答案 5 :(得分:0)

它可以简单地通过使用绝对值使所有数字为正然后对数组进行排序来完成:

        int[] arr = {9, 1, 4, 5, 6, 7, -1, -2};

        for (int i = 0; i < arr.length; ++i)
        {
            arr[i] = Math.abs(arr[i]);
        }

        Arrays.sort(arr);
        System.out.println("Closest value to 0 = " + arr[0]);

答案 6 :(得分:0)

当您将data [i]与data [i]相乘时,负值和正值将产生相同的影响。 例如,在您的示例中:2和-2将为4.因此,您的代码无法根据需要进行排序。

所以,在这里,它需要-2作为近似值,因为它具有相同的&#34;权重&#34;为2。

答案 7 :(得分:0)

public class ClosesttoZero {
    
      static int closZero(int[] ints) {
        
        int result=ints[0];
        for(int i=1;i<ints.length;i++) {
            if(Math.abs(result)>=Math.abs(ints[i])) {
                result=Math.abs(ints[i]);
            }
        }
        return result;
        
        
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        
        int[] ints= {1,1,5,8,4,-9,0,6,7,1};
        int result=ClosesttoZero.closZero(ints);
        System.out.println(result);
        
        
    }

}

答案 8 :(得分:0)

public int check() {

    int target = 0;
    int[] myArray = { 40, 20, 100, 30, -1, 70, -10, 500 };
    int result = myArray[0];
    for (int i = 0; i < myArray.length; i++) {
        if (myArray[i] == target) {
            result = myArray[i];
            return result;
        }
        if (myArray[i] > 0 && result >= (myArray[i] - target)) {
            result = myArray[i];
        }
    }
    return result;
}

我已经为正数本身添加了一个检查。 请大家分享你的看法!!

答案 9 :(得分:0)

如果您不想使用内置库函数,请使用下面的代码(只是现有代码的一个和条件)-

public class CloseToZero {
    public static void main(String[] args) {
        int[] data = {2,3,-2,-1,1};
        int curr = 0;
        int near = data[0];
        // find the element nearest to zero
        for ( int i=0; i < data.length; i++ ){
            curr = data[i] * data[i];
            if ( curr <= (near * near) && !((curr - (near * near) == 0) && data[i] < 0))  {
                    near = data[i];
            }
        }
        System.out.println( near );
    }
}

!((curr - (near * near) == 0) && data[i] < 0) : 如果 nearcurr 正好相反,而 curr 是负数,则跳过赋值

答案 10 :(得分:0)

我们必须找到最接近零的数字。 给定的数组也可以有负值。 所以最简单的方法是在给定的数组中附加 '0' 并对其进行排序并返回 '0' 旁边的元素

  1. 附加0
  2. 对数组进行排序
  3. 返回 0 旁边的元素。

`

N = int(input())

arr = list(map(int, input().split()))

arr.append(0)
arr.sort()

zeroIndex = arr.index(0)
print(arr[zeroIndex + 1])

--> 如果这个解决方案留下了极端情况,也请告诉我。

`

答案 11 :(得分:0)

要保持O(n)的时间复杂度并获得所需的结果,我们必须添加另一个名为“ num”的变量,并在更改其值之前将其分配给“ near”。最后进行必要的检查。代码中的改进包括:

public class CloseToZero {    
    public static void main(String[] args) {    
        int[] data = {2,3,-2};    
        int curr = 0;    
        int near = data[0]; 
        int num=near;
        // find the element nearest to zero    
        for ( int i=0; i < data.length; i++ ){    
            curr = data[i] * data[i];     
            if ( curr <= (near * near) )  {     
                num=near;
                near = data[i]; 
            }     
        }    
        if(near<0 && near*(-1)==num)
           near=num;
        System.out.println( near );    
    }    
}

答案 12 :(得分:0)

我用不同的方法有相同的答案,使用Collections和abs可以解决。

  static int Solve(int N, int[] A){
      List<Integer> mInt=new ArrayList<>();
        for ( int i=0; i < A.length; i++ ){
            mInt.add(Math.abs(0 -A[i]));
        }
        return Collections.min(mInt);
    }

就这么简单

答案 13 :(得分:0)

打包解决方案;

导入java.util.Scanner;

公共类解决方案{

public static void trier(int tab[]) {

    int tmp = 0;

    for(int i = 0; i < (tab.length - 1); i++) {

        for(int j = (i+1); j< tab.length; j++) {

            if(tab[i] > tab[j]) {
                tmp = tab[i];
                tab[i] = tab[j];
                tab[j] = tmp;

            }

        }

    }

    int prochePositif = TableauPositif(tab);

    int procheNegatif = TableauNegatif(tab);

    System.out.println(distanceDeZero(procheNegatif,prochePositif));



}
public static int TableauNegatif(int tab[]) {

    int taille = TailleNegatif(tab);


    int tabNegatif[] = new int[taille];


    for(int i = 0; i< tabNegatif.length; i++) {

        tabNegatif[i] = tab[i];
    }
    int max = tabNegatif[0];

    for(int i = 0; i <tabNegatif.length; i++) {

        if(max < tabNegatif[i])
            max = tabNegatif[i];
    }
    return max;


}
public static int TableauPositif(int tab[]) {

    int taille = TailleNegatif(tab);

    if(tab[taille] ==0)
        taille+=1;


    int taillepositif = TaillePositif(tab);

    int tabPositif[] = new int[taillepositif];



    for(int i = 0; i < tabPositif.length; i++) {


        tabPositif[i] = tab[i + taille];

    }
    int min = tabPositif[0];
    for(int i = 0; i< tabPositif.length; i++) {

        if(min > tabPositif[i])
            min = tabPositif[i];
    }
    return min;


}

public static int TailleNegatif(int tab[]) {
    int cpt = 0;

    for(int i = 0; i < tab.length; i++) {

        if(tab[i] < 0) {
            cpt +=1;

        }
    }
    return cpt;

}
public static int TaillePositif(int tab[]) {
    int cpt = 0;

    for(int i = 0; i < tab.length; i++) {

        if(tab[i] > 0) {
            cpt +=1;

        }
    }
    return cpt;

}

public static int distanceDeZero(int v1, int v2) {

    int absv1 = v1 * (-1);

    if(absv1 < v2)
        return v1;

    else if(absv1 > v2)
        return v2;
    else 
        return v2;



}

public static void main(String[] args) {

    int t[] = {6,5,8,8,-2,-5,0,-3,-5,9,7,4};

    Solution.trier(t);


}

}

答案 14 :(得分:0)

static void closestToZero(){
    int[] arr = {45,-4,-12,-2,7,4};
    int max = Integer.MAX_VALUE;
    int closest = 0;
    for (int i = 0; i < arr.length; i++){
        int value = arr[i];
        int abs = Math.abs(value);
        if (abs < max){
            max = abs;
            closest = value;
        }else if (abs == max){
            if (value > closest){
                closest = value;
            }
        }
    }

如果两个绝对值相同,则返回正整数。

答案 15 :(得分:0)

最简单的以升序对数组进行排序的方法是假设输入像:

int[] array = {10,-5,5,2,7,-4,28,65,95,85,12,45};

然后将其排序后将给出如下输出:

{-5,-4,2,5,7,10,12,28,45,65,85,95,}

,对于正整数,最接近的正数是: 2

逻辑:

public class Closest {

public static int getClosestToZero(int[] a) {

    int temp=0;
    //following for is used for sorting an array in ascending nubmer
    for (int i = 0; i < a.length-1; i++) {
        for (int j = 0; j < a.length-i-1; j++) {
            if (a[j]>a[j+1]) {
                temp = a[j];
                a[j]=a[j+1];
                a[j+1]=temp;
            }
        }
    }
    //to check sorted array with negative & positive  values
    System.out.print("{");
    for(int number:a)
        System.out.print(number + ",");

    System.out.print("}\n");
    //logic for check closest positive and Integer
    for (int i = 0; i < a.length; i++) {
        if (a[i]<0 && a[i+1]>0) {
            temp = a[i+1];
        }
    } 
    return temp;
}

  public static void main(String[] args) {
    int[] array = {10,-5,5,2,7,-4,28,65,95,85,12,45};
    int closets =getClosestToZero(array);
    System.out.println("The Closest Positive number is : "+closets);
  }

}

答案 16 :(得分:0)

最简单的处理方法是将数组分为正数和负数,然后将两个数组中的前两个项推入另一个数组。玩得开心!

function closeToZeroTwo(arr){
let arrNeg = arr.filter(x => x < 0).sort();
let arrPos = arr.filter(x => x > 0).sort();
let retArr = []; 
retArr.push(arrNeg[0], arrPos[0]);
console.log(retArr)
}

答案 17 :(得分:0)

您可以这样做:

String res = "";

        Arrays.sort(arr);
        int num = arr[0];
        int ClosestValue = 0;

        for (int i = 0; i < arr.length; i++)
        {
            //for negatives
            if (arr[i] < ClosestValue && arr[i] > num)
            num = arr[i];
            //for positives
            if (arr[i] > ClosestValue && num < ClosestValue)
            num = arr[i];
        }
        res = num;

        System.out.println(res);

首先,您需要将所有数字存储到数组中。之后,对数组进行排序->这就是使您不使用Math.abs()的窍门。现在是时候进行遍历数组的循环了。知道数组已排序很重要,您首先要对负数然后对正数开始使用IF语句(这样,如果您将有两个最接近零的值,那么假设-1和1->将打印正数)一个)。

希望这会对您有所帮助。

答案 18 :(得分:0)

这是一种使您最接近零的方法。

  • 用例1:{1,3,-2} ==>返回1:使用Math.abs()进行比较并获得最少的结果。
  • 用例2:{2,3,-2} ==>返回2:使用Math.abs()进行比较并获得Math.abs(least)
  • 用例3:{-2,3,-2} ==>返回-2:使用Math.abs()进行比较并获得最少的结果。

    public static double getClosestToZero(double[] liste) {
    // if the list is empty return 0
    if (liste.length != 0) {
        double near = liste[0];
        for (int i = 0; i < liste.length; i++) {
            // here we are using Math.abs to manage the negative and
            // positive number
            if (Math.abs(liste[i]) <= Math.abs(near)) {
                // manage the case when we have two equal neagative numbers
                if (liste[i] == -near) {
                    near = Math.abs(liste[i]);
                } else {
                    near = liste[i];
                }
            }
        }
        return near;
    } else {
        return 0;
    }
    

    }

答案 19 :(得分:0)

假设数组data至少有1个值。

int closedToZero = 0;
for ( int i = 1; i < data.length; i++ )
{
    if ( Math.abs(data[i]) < Math.abs(data[closedToZero]) ) closedToZero = i;
}

closedToZero中的值是关闭到零的索引,而不是值。

答案 20 :(得分:-1)

public static int find(int[] ints) {
    if (ints==null) return 0;
    int min= ints[0];   //a random value initialisation 
    for (int k=0;k<ints.length;k++) {
        // if a positive value is matched it is prioritized              
        if (ints[k]==Math.abs(min) || Math.abs(ints[k])<Math.abs(min)) 
            min=ints[k];            
    }
    return  min;
}
相关问题