数组处理(拉伸)方法

时间:2017-11-06 19:29:14

标签: java arrays

我正在寻找如何解决这个问题或我出错的地方。

问题如下:编写一个名为stretch的静态方法,它接受一个整数数组作为参数,并返回一个两倍于原始数组的新数组,用一对整数替换原始数组中的每个整数,每个整数原来的一半。如果原始数组中的数字是奇数,则新对中的第一个数字应该比第二个数字高一个,以使总和等于原始数字。例如,如果名为list的变量引用存储值{18,7,4,24,11}的数组,则调用stretch(list)应该返回一个包含{9,9,4,3,2的新数组,2,12,12,6,5}。 (数字18被拉伸成对9,9,数字7被拉伸为4,3,数字4被拉伸为2,2,数字24被拉伸为12,12,数字11被拉伸为6 ,5。) 使用以下类测试代码: import java.util。*;

public class TestStretch {
    public static void main(String[] args) {
        int[] list = {18, 7, 4, 14, 11};
        int[] list2 = stretch(list);
        System.out.println(Arrays.toString(list));  // [18, 7, 4, 24, 11]
        System.out.println(Arrays.toString(list2)); // [9, 9, 4, 3, 2, 2, 7, 7, 6, 5]
    }

    // your code goes here
}

这是我现在所拥有的,但是它工作不正常...我感觉这是我如何使用int i和int j,但我不确定该怎么做修复它以使其按预期工作。

import java.util.*;

public class TestStretch {
    public static void main(String[] args) {
        int[] list = {18, 7, 4, 14, 11};
        int[] list2 = stretch(list);
        System.out.println(Arrays.toString(list));  // [18, 7, 4, 24, 11]
        System.out.println(Arrays.toString(list2)); // [9, 9, 4, 3, 2, 2, 7, 7, 6, 5]
    }
    public static int[] stretch(int[] array){
        int length = array.length;
        int[] newArray = new int[array.length*2];
        for(int i = 0; i< length; i=i+2){
            int j = 0;
           if(array[i] % 2 == 0){
               newArray[i] = (array[j]/2);
               newArray[i+1] = newArray[i];
               j++;
           } else{
               newArray[i] = (array[j]/2);
               newArray[i+1] = (newArray[i] + 1);
               j++;
           }

        }

        return newArray;
    }

}

我得到的输出是:

[18, 7, 4, 14, 11]    
[9, 9, 9, 9, 9, 10, 0, 0, 0, 0]

而不是:

[18, 7, 4, 24, 11]    
[9, 9, 4, 3, 2, 2, 7, 7, 6, 5]

4 个答案:

答案 0 :(得分:1)

有几个错误:

  • 循环只迭代到数组的一半,跳过元素2
  • j的值在每次迭代中重置为0

此外,该算法可以简化:

  • 对于输入中的每个索引i,您希望在目标位置2 * i2 * i + 1设置。
  • 要设置的第二个值只是原始值除以2,带有整数截断
  • 要设置的第一个值与第二个值相同,如果除以2则为+1,则为+1

纠正上述问题,并简化实施:

int[] newArray = new int[array.length * 2];
for (int i = 0; i < array.length; i++) {
    newArray[2 * i] = array[i] / 2 + array[i] % 2;
    newArray[2 * i + 1] = array[i] / 2;
}

return newArray;

答案 1 :(得分:0)

三个错误:

  1. j应该在for-loop
  2. 之外进行初始化
  3. 我们应该使用j将新值记录到新数组
  4. 我们应该在2中的每次迭代时增加j - 我们应该将i仅增加1(因为我们使用j来插入两个项目我们使用i来迭代原始数组:

    int j = 0;
    for(int i = 0; i< length; i++){
        if(array[i] % 2 == 0){
            newArray[j] = newArray[j+1] = array[i]/2;
        } else{
            newArray[j] = array[i]/2 + 1;
            newArray[j+1] = array[i]/2;
        }
        j += 2;
    }
    
  5. 注意:给一个包含数组的变量名称&#34; list&#34;可能会造成混乱!

答案 2 :(得分:0)

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

length是原始数组的长度,因此您只迭代超过一半的值,因为每步增加i {。}}。

2

这应该是

if(array[i] % 2 == 0){

因为你在for循环中定义if(array[j] % 2 == 0){ ,所以array [j]总是返回j。哦,你将元组的第二个元素设置为较高元素,而代码中的注释则表示相反应该发生。

因此,您的方法的固定版本将如下所示:

18

避免重复代码:

public static int[] stretch(int[] array){
    int length = array.length;
    int[] newArray = new int[array.length*2];
    int j = 0;
    for(int i = 0; i< newArray.length; i=i+2){
       if(array[j] % 2 == 0){
           newArray[i] = (array[j]/2);
           newArray[i+1] = newArray[i];
       } else{
           newArray[i+1] = (array[j]/2);
           newArray[i] = (newArray[i+1] + 1);
       }
       j++;

    }

    return newArray;
}

或者使用花哨的流:

public static int[] stretch(int[] array){
    int[] newArray = new int[array.length*2];
    int j = 0;
    for(int i = 0; i< newArray.length; i=i+2){
        int val = array[j];
        newArray[i] = (val/2);
        newArray[i+1] = newArray[i];
        if(val % 2 != 0){
            newArray[i]++;
        }
        j++;
    }

    return newArray;
}

答案 3 :(得分:0)

首先,如果循环到旧数组的长度,请不要将i增加2。

如果i每次增加1,我们需要弄清楚如何将旧数组的索引i映射到新数组的索引。这很简单:新数组的索引只是i*2i*2+1

现在j似乎是多余的,因为它始终与i保持相同的值,因此您可以将其删除。

这是完整的代码:

int length = array.length;
int[] newArray = new int[array.length*2];
for(int i = 0; i< length; i++){
    if(array[i] % 2 == 0){
        newArray[i*2] = (array[i]/2);
        newArray[i*2+1] = newArray[i*2];
    } else{
        newArray[i*2] = (array[i]/2);
        newArray[i*2+1] = (newArray[i*2] + 1);
    }

}

return newArray;