在阵列增量数字,直到它们都等于[关闭](increment numbers in an array

2019-08-05 05:33发布

这项计划的目标是让所有的数字阵列中的相同。 你必须增加阵列中的所有值除了每次一个。 然后该程序将打印出的,将采取让所有的数字相同的步骤的最小数量。 我有什么,我相信这是一个工作解决方案,我只是想使之更有效率,没有任何一个有什么想法? 在下面的代码,用户的号码到阵列进入初始值,然后计算出的步骤所需要的量

public static void main(String[] args) throws NumberFormatException, IOException 
{
counter=0;
         size=sc.nextInt();
         input= new int[size];
        for(int k=0; k<size; k++)
        {
            input[k]=sc.nextInt();
        }
        while(!isAllEqual(input))
        {
            Arrays.sort(input);
            for(int k=0; k<input.length-1; k++)
            {
                input[k]++;
            }
            counter++;
        }
        pw.println(counter);

public static boolean isAllEqual(int[] a){
    for(int i=1; i<a.length; i++){
        if(a[0] != a[i]){
            return false;
        }
    }
return true;
}

Answer 1:

这可能是更容易,如果你改变了一步成更简单的东西环绕这你的头。 如果我们只谈论的值之间的平等(即相对的,不是绝对的值),递增和递减所有的值在一次没什么区别。 如果我们改变我们的步骤,以“增加所有,但一个,然后通过一个递减的每个值”,我们可以看到,递增所有,但一个相当于递减一个值。

你能想出的步骤,以使值相等如果步长“递减一个值”是多少? 它应包括通过阵列两次在最大,而且没有排序循环。



Answer 2:

主要编辑为我误解的问题

浏览列表只是一次在列表中找到和最小值的总将所有的值加在一起的。

一旦你有了这两个值,需要增加的数量是:

[总所有值] - [数在列表中的项目的] * [最小值]

在代码:

public static int numberOfSteps(int[] a) {
    if( a.length==0 ) return 0;

    int min= a[0];
    int total = a[0];
    for(int i=1;i<a.length;i++) {
        if( a[i] < min ) min = a[i];
        total += a[i];
    }

    return total - a.length * min;
}

这工作,因为(作为马蒂Virkkunen指出)递减的每个项目的编号为(a[i] - min )所以对于整个列表是sum(a[i]-min)我们可以扩展到sum(a[i]-(length*min)

相应的增量将是在每一步递增一切除其等于最大最右边的项目。 例如:

初始状态=(0,1,1,1)1.增量一切,除了[3] - >(1,2,2,1)2.增量一切,除了一个[2] - >(2,3, 2,2)3.增量一切,除了一[1] - >(3,3,3,3):溶液分三步=(1 + 1 + 1) - (4 * 0)

又一次,的初始状态(1,2,3,3-)

  1. 递增一切,除了[3] - >(2,3,4,3)
  2. 递增一切,除了一个[2] - >(3,4,4,4)
  3. 递增一切,除了[3] - >(4,5,5,4)
  4. 递增一切,除了一个[2] - >(5,6,5,5)
  5. 除了递增一个[1]的一切 - >(6,6,6,6):溶液在五个步骤=(1 + 2 + 3 + 3) - (4 * 1)


文章来源: increment numbers in an array until they are all equal [closed]