在做数组作业的过程中,遇到了一个问题,题目是定义一个数组其中包含多个数字。用自己的方式最终实现,奇数放在数组的左边,偶数放在数组的右边。(可以创建其他数组,不必须在原数组中改变)。
如果创建其他数组的话,解题的方法当然就很简单了,创建一个新数组,奇数从前往后插入,偶数从后往前插入,核心部分代码如下
for(int i = 0, j = arr1.length - 1,count = 0; count < arr1.length; count++){
if(arr1[count] % 2 != 0){
arr2[i] = arr1[count];
i++;
} else {
arr2[j] = arr1[count];
j--;
}
}
如果不创建新数组,只在原数组中修改次序,则稍微复杂一些,不过算法倒也不难想出,利用双重循环,外层循环计数变量为i,从前往后遍历数组arr,如果遇到偶数,则进入内层循环,遍历到数组最后一个元素终止;内层循环从后往前遍历数组,计数变量为j,遍历到i
=j处中止,如果遇到奇数,则交换arr[i]与arr[j]的值,代码如下
for (int i = 0; i < arr1.length; i++) {
if(arr1[i]%2 == 0) {
for (int j = arr1.length - 1; j > i; j--) {
if (arr1[j] % 2 != 0){
temp = arr1[i];
arr1[i] = arr1[j];
arr1[j] = temp;
}
}
}
}
从功能方面来说,这段代码已经实现了题目要求的功能,但从优化的方面来说,这段代码仍有冗余的计算,如果外层循环还没遍历完成,但此时的数组已经满足题目要求,循环仍然会继续走到结束,不会停下来,加长了程序运行时间。如果能在数组满足要求时便终止,那么便可大大减少运算量。
当i=j时,代表i这个位置是偶数,但i后面的元素也都是偶数,此时数组便满足题目要求了,于是我首先在循环外定义变量j,以便让更改后的j变量能够进入外层循环中,然后在外层循环最末尾加了判断条件,满足i==j便break终止循环,代码如下
int temp = 0;
int j = 0;
for (int i = 0; i < arr1.length; i++) {
if(arr1[i]%2 == 0) {
for (j = arr1.length - 1; j > i; j--) {
if (arr1[j] % 2 != 0){
temp = arr1[i];
arr1[i] = arr1[j];
arr1[j] = temp;
}
}
if (i == j)
break;
}
}
这段代码是有问题的,运行后的结果不满足题目要求,我思考了很久(新手,还没学idea的debug怎么用。。),终于找到了问题所在,内层循环的每一轮,都会跑到j=i的位置去,内层也有冗余的运算啊!所以解决办法是,内层循环交换元素后,直接break,这样便解决了刚才的问题
int temp = 0;
int j = 0;
for (int i = 0; i < arr1.length; i++) {
if(arr1[i]%2 == 0) {
for (j = arr1.length - 1; j > i; j--) {
if (arr1[j] % 2 != 0){
temp = arr1[i];
arr1[i] = arr1[j];
arr1[j] = temp;
break;
}
}
if(i == j)
break;
}
}
看似一个简单的问题,如果只是简单创建一个新数组了事,那当然非常简单了,但如果想节省这个数组的空间,在原数组中交换次序,就会复杂不少,如果想进一步节省时间,则有需要对代码进行优化,数组满足要求便及时break结束循环。学代码的过程中,还是要勤快点,对自己的要求高一些,模块化,优化,格式,都要注意,养成良好的习惯,省的以后脑袋浑浑噩噩,写出一大堆屎山代码,又慢又乱不说,还要被人家骂。。
终于是把这个问题研究透了,开心~
标签:满足条件,arr1,temp,跳出,int,代码,length,循环,数组 From: https://www.cnblogs.com/feng-579/p/17530347.html