HackerRank最近的号码

时间:2018-11-23 16:04:35

标签: java

给出一个未排序的整数列表,找到一对它们之间的绝对差最小的元素。如果有多对,则全部找到。

我的理由是将arr[j] - arr[i]lowest进行比较,如果该值小于或等于该值,则将该值添加到最低的数组中,但不起作用。

代码:

static int[] closestNumbers(int[] arr) {
    int lowest = arr[1] - arr[0];
    int lowestArray[] = new int[arr.length];
    for (int i = 0; i < arr.length; i++) {
        for (int j = i + 1; j < arr.length; j++) {
            if (Math.abs(arr[j] - arr[i]) < lowest) {
                lowest = Math.abs(arr[j] - arr[i]);
            }
        }
    }

    for (int i = 0; i < arr.length; i++) {
        if (arr[i] == lowest) {
            lowestArray[i] = arr[i];
        }
    }
    return lowestArray;
}

3 个答案:

答案 0 :(得分:1)

问题是,当您像这样初始化最低的数组时,

int[] lowest = new int[arr.length];

您实际上是用零初始化的。另外,无论何时使用arr [j] -arr [i],它总是大于或等于零(因为数组以升序排序),导致错误的结果,因为以下if语句

if(Math.abs(arr[j] - arr[i]) <= lowest[l]) {
     lowest[l] = Math.abs(arr[j] - arr[i]);
}

永远不会执行大于0的差异。

像这样初始化最低的数组,

for(int i=0;i<lowest.length;i++){ 
    lowest[i] = Integer.MAX_VALUE; 
}

另外,您的i变量的外循环以i = 1开头,但应以i = 0开头

答案 1 :(得分:1)

下面是必需的代码:-

import java.util.*; 

class GFG 
{ 

// Returns minimum difference between 
// any two pair in arr[0..n-1] 
static void printMinDiffPairs(int arr[], int n) 
{ 
    if (n <= 1) 
    return; 

    // Sort array elements 
    Arrays.sort(arr); 

    // Compare differences of adjacent 
    // pairs to find the minimum difference. 
    int minDiff = arr[1] - arr[0]; 
    for (int i = 2; i < n; i++) 
    minDiff = Math.min(minDiff, arr[i] - arr[i-1]); 

    // Traverse array again and print all pairs 
    // with difference as minDiff. 
    for ( int i = 1; i < n; i++) 
    { 
        if ((arr[i] - arr[i-1]) == minDiff) 
        { 
        System.out.print("(" + arr[i-1] + ", "
                        + arr[i] + ")," ); 
        }                    
    } 
} 

// Driver code 
public static void main (String[] args) 
{ 
    int arr[] = {5, 3, 2, 4, 1}; 
    int n = arr.length; 
    printMinDiffPairs(arr, n); 
} 
}

以上程序可以处理重复项吗?

上述程序无法处理{x,x,x}之类的情况。在这种情况下,预期输出(x,x),(x,x),(x,x),但在程序上方会打印(x,x),(x,x)

答案 2 :(得分:0)

static int[] closestNumbers(int[] arr) {
        int minAbs = Integer.MAX_VALUE;
        Arrays.sort(arr);
        int[] out = new int[(arr.length) + 3];
        int j = 0;
        for (int i = 1; i < arr.length; i++) {
            minAbs = Math.min(minAbs, Math.abs(arr[i] - arr[i - 1]));
            
        }
        
        for (int i = 1; i < arr.length; i++) {
            if(minAbs ==Math.abs(arr[i] - arr[i - 1])) {
                out[j++]=arr[i - 1];
                out[j++]=arr[i];
            }
        }
        int[] tem= new int[j];
        for(int i=0; i<j;i++) {
            tem[i]=out[i];
        }
        
        
        return tem;
    }