'Finding closest number to 0

I am trying to troubleshoot a program in Java.

Requirements: Need to find the closest value to zero in an Array. In the Array if the values are like 1 and -1 the closest should be the positive value.

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 );    
    }    
}


Solution 1:[1]

This will do it in O(n) time:

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 ]);

Solution 2:[2]

Just add zero to this list.

Then sort the list

Arrays.sort(data);

then grab the number before or after the zero and pick the minimum one greater than zero

Solution 3:[3]

If you are using 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);
    }
}

Solution 4:[4]

Assumption is that the array data has at least 1 value.

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

The value in closedToZero is the index of the closed to zero, not the value.

Solution 5:[5]

 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;
    }

Solution 6:[6]

As you multiply data[i] with data[i], a value negative and a value positive will have the same impact. For example, in your example: 2 and -2 will be 4. So, your code is not able to sort as you need.

So, here, it takes -2 as the near value since it has the same "weight" as 2.

Solution 7:[7]

here is a method that gives you the nearest to zero.

  • use case 1 : {1,3,-2} ==> return 1 : use the Math.abs() for comparison and get the least.
  • use case 2 : {2,3,-2} ==> return 2 : use the Math.abs() for comparison and get the Math.abs(least)
  • use case 3 : {-2,3,-2} ==> return -2: use the Math.abs() for comparison and get the least.

    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;
    }
    

    }

Solution 8:[8]

You can do like this:

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);

First of all you need to store all your numbers into an array. After that sort the array --> that's the trick who will make you don't use Math.abs(). Now is time to make a loop that iterates through the array. Knowing that array is sorted is important that you start to make first an IF statement for negatives numbers then for the positives (in this way if you will have two values closest to zero, let suppose -1 and 1 --> will print the positive one).

Hope this will help you.

Solution 9:[9]

The easiest way to deal with this is split the array into positive and negative sort and push the first two items from both the arrays into another array. Have fun!

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)
}

Solution 10:[10]

Easiest way to just sort that array in ascending order suppose input is like :

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

then after sorting it will gives output like:

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

and for positive integer number, the Closest Positive number is: 2

Logic :

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);
  }

}

Solution 11:[11]

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;
            }
        }
    }

Return a positive integer if two absolute values are the same.

Solution 12:[12]

package solution;

import java.util.Scanner;

public class Solution {

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);


}

}

Solution 13:[13]

I have same answer with different method,Using Collections and abs , we can solved.

  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);
    }

That all,As simple as that

Solution 14:[14]

To maintain O(n) time complexity and getting the desired results we have to add another variable called 'num' and assign to it 'near' before changing it's value. And finally make necessary checks. The improvements in the code are are:

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 );    
    }    
}

Solution 15:[15]

We have to find the Closest number to zero. The given array can have negative values also. So the easiest approach would append the '0' in the given array and sort it and return the element next to '0'

  1. append the 0
  2. Sort the Array
  3. Return the element next to 0.

`

N = int(input())

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

arr.append(0)
arr.sort()

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

--> If this solution leaves corner cases please let me know also.

`

Solution 16:[16]

if you don't wanna use the inbuilt library function use the below code (just an and condition with your existing code)-

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) : skip asignment if if near and curr is just opposit in sign and the curr is negative

Solution 17:[17]

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;
}

I have added a check for the positive number itself. Please share your views folks!!

Solution 18:[18]

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);
        
        
    }

}

Solution 19:[19]

It can be done simply by making all numbers positive using absolute value then sort the Array:

        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]);

Solution 20:[20]

import java.math.*;

class Solution {

    static double closestToZero(double[] ts) {
        if (ts.length == 0)
            return 0;

        double closestToZero = ts[0];
        double absClosest = Math.abs(closestToZero);

        for (int i = 0; i < ts.length; i++) {
            double absValue = Math.abs(ts[i]);

            if (absValue < absClosest || absValue == absClosest && ts[i] > 0) {
                closestToZero = ts[i];
                absClosest = absValue;
            }
        }

        return closestToZero;
    }
}

Solution 21:[21]

Hakerearth Solution in Python 3.8 nearest number to zero

input 5

  • -4 4 6 7 8
  • Answer: 4
    N = int(input())
    A = [int(i) for i in input().split()][:N]
    my_list = []
    A.insert(0, 0)
    A.sort()


    for i in range(0, len(A)):
       if (A[i] == 0):
          my_list.insert(0, abs(A[i - 1]))
          my_list.insert(1, abs(A[i + 1]))
          break


    if(my_list[0] == my_list[1]):
        print my_list[1]
    elif (my_list[0] > my_list[1]):
        print my_list[1]
    else:
        print my_list[0]

Complete solution of Haker Earth Problem of nearest to zero in Python 3.8

Solution 22:[22]

This is a very easy to read O(n) solution for this problem.

    int bigestNegative = Integer.MIN_VALUE;
    int smalestpositive = Integer.MAX_VALUE;
    int result = 0; 

    for (int i = 0; i < n; i++) {
        //if the zero should be considered as result as well
        if ( temperatures[i] == 0 )  { 
           result = 0;
           break;
        } 
        if ( temperatures[i] > 0 && temperatures[i] < smalestpositive )  { 
            smalestpositive = temperatures[i];
        } 
        if ( temperatures[i] < 0 && temperatures[i] > bigestNegative )  { 
            bigestNegative = temperatures[i];
        } 
    }
    if( (Math.abs(bigestNegative)) < (Math.abs(smalestpositive)) && bigestNegative != Integer.MIN_VALUE)
        result = bigestNegative;
    else
        result = smalestpositive;
    System.out.println( result );

Solution 23:[23]

First convert the int array into stream. Then sort it with default sorting order. Then filter greater than zero & peek the first element & print it. Do it in declarative style which describes 'what to do', not 'how to do'. This style is more readable.

int[] data = {2,3,-2};
IntStream.of(data)
    .filter(i -> i>0)
    .sorted()
    .limit(1)
    .forEach(System.out::println);

Solution 24:[24]

using Set Collection and abs methode to avoid complex algo

public static void main(String[] args) {

    int [] temperature={0};

    ***// will erase double values and order them from small to big***
    Set<Integer> s= new HashSet<Integer>();
    
    if (temperature.length!=0) {
        
        for(int i=0; i<temperature.length; i++) {
        
            ***// push the abs value to the set*** 
            s.add(Math.abs(temperature[i]));
        }
        
        // remove a zero if exists in the set 
        while(s.contains(0)) {
            s.remove(0);
        }
        
        ***// get first (smallest) element of the set : by default it is sorted*** 
        
        if (s.size()!=0) {
            Iterator iter = s.iterator();
            System.out.println(iter.next());
        }
        
        else System.out.println(0);
        
        
    }
    
    else System.out.println(0);
    
    

}

Solution 25:[25]

Solved in Swift with 0.2 sec execution time and O(N) time complexity -

func findClosestToZero(arr: [Int]) -> Int {
    var diff = 0 - (arr[0] * arr[0])

    var near = arr[0]

    for i in 0..<arr.count {
        let value = arr[i]
        let newDiff = (0-(value * value)) 

        if newDiff > diff {
            near = value 
            diff = newDiff 
        } else if newDiff == diff && value > 0{
            near = value 
            diff = newDiff 
        }
    }

    return near   
}

Solution 26:[26]

//My solution priorizing positive numbers contraint

int closestToZero = Integer.MAX_VALUE;//or we

    for(int i = 0 ; i < arrayInt.length; i++) {
                
            if (Math.abs(arrayInt[i]) < closestToZero 
                        || Math.abs(closestToZero) == Math.abs(arrayInt[i]) && arrayInt[i] > 0 ) {
                    
                closestToZero = arrayInt[i];
            }
        }

Solution 27:[27]

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;
}