找到第三大数字的输出没有达到预期的效果

时间:2015-12-03 19:12:22

标签: java arrays

  

给定一个整数数组,找出数组中第三大的值。

MyApproach

示例输入#1

删除({1,2,3,4,5,0,1,2,0,0,2})

样本输出#1

{1,2,3,4,5,1,2,2}

示例输入#2

删除({0,0,1,2})

样本输出#2

{1,2}

示例输入#3

删除({0,0,0,0})

样本输出#3

{}

MyApproach

@Edit

为了找到最大数量,我对数组进行了排序并返回了最大数量。

以下是我的代码。

感谢大家的支持。

以下是我的代码:

public int thirdLargest(int[] arr)
{
 for(int i=0;i<arr.length;i++)
 {
   int temp=0;
   int large=0;
   int index=0;

       large=arr[i];
       for(int j=i;j<arr.length;j++)
       {
           if(arr[j]>=large)
           {
               large=arr[j];
               index=j;
            }
        }
       temp=arr[i];
       arr[i]=arr[index];
       arr[index]=temp;
 }
 return arr[2];
}

2 个答案:

答案 0 :(得分:1)

你可以这样做:

public static int thirdLargest(int[] array) {
    int largest = Integer.MIN_VALUE;
    int secondLargest = Integer.MIN_VALUE;
    int thirdLargest = Integer.MIN_VALUE;

    for (int number : array) {

        if (largest < number) {
            thirdLargest = secondLargest;
            secondLargest = largest;
            largest = number;
        } else if (secondLargest < number) {
            thirdLargest = secondLargest;
            secondLargest = number;
        } else if (thirdLargest < number) {
            thirdLargest = number;
        }
    }

    return thirdLargest;
}

使用'{-1,-1,-1,-1,-1}'输入进行测试,并返回-1。

现在在调整代码之后:

public static int thirdLargest(int[] arr) {

    int max1 = findMax(arr);
    int p[] = remove(arr, max1);
    int max2 = findMax(p);
    int q[] = remove(p, max2);
    int max3 = findMax(q);
    return max3;
}

static int findMax(int[] arr) {
    int max = arr[0];
    for (int i = 1; i < arr.length; i++) {
        if (arr[i] >= max) {
            max = arr[i];

        }
    }
    return max;
}

static int[] remove(int[] arr, int max) {
    int index = 0;
    for (int i = 0; i < arr.length; i++) {
        if (arr[i] == max) {
            index = i;
            break;
        }
    }

    int p[] = new int[arr.length - 1];
    for (int m = 0, n = 0; m < arr.length; m++) {

        if (index != m) {
            p[n] = arr[m];
            n++;
        }
    }
    return p;

}

原因:remove方法只应删除一个最大值的事件。

答案 1 :(得分:0)

您不应该从给定的阵列中删除数据。您要求输出第三大值,因此您应该只输出而不是修改输入中的数组。此数组可能需要稍后使用,并且可以假设由于您只找到第三大数组,因此输入数组将保持不变。

我会通过保持3个整数的数组来做到这一点。整数对应最大的3个数字,arr[0]是最大的,arr[1]是第二大,arr[2]是第三大。然后,遍历输入中的每个数字,如果它大于3个数字中的任何一个,则将其他2个数字向下推,然后插入新数字。

public static int find3rdLargest(int [] arr){
    int [] largest3Numbers = {Integer.MIN_VALUE,Integer.MIN_VALUE,Integer.MIN_VALUE}; // Initialize array with minimum int values possible, since we are finding largest
    for(int i : arr){ // Loop over each item in input
        if(i > largest3Numbers[0]){ // if its the largest number
            largest3Numbers[2] = largest3Numbers[1]; // set 2nd largest to 3rd
            largest3Numbers[1] = largest3Numbers[0]; // set largest to 2nd
            largest3Numbers[0] = i; // set new largest
        }else if (i > largest3Numbers[1]){ // if it is the second largest number
            largest3Numbers[2] = largest3Numbers[1]; // set 2nd largest to 3rd
            largest3Numbers[1] = i; // set new 2nd largest
        }else if (i > largest3Numbers[2]){ // if it is the 3rd largest
            largest3Numbers[2] = i; // set it to 3rd largest
        }
    }
    return largest3Numbers[2]; // return 3rd largest
}

我通过运行以下来测试了这个功能:

public static void main(String[] args) throws Exception {

    int[] shouldOutput4 = { 1,2,3,4,5,6 };
    int[] shouldOutput0 = { 0,0,0,0,0,0 };
    System.out.println("Should output 4: " + find3rdLargest(shouldOutput4));
    System.out.println("Should output 0: " + find3rdLargest(shouldOutput0));

}

这给了我输出:

Should output 4: 4
Should output 0: 0