写东西的目的主要是在于整理总结和“烂笔头”的记录;其次写作是一种很好的表达方式,也是纠结了好久才决定的(为了自己想要写好而写的)。
关于优化,有件小事印象挺深的。还记得当时刚接触编程,做一个小练习(后来还翻了之前的稚嫩代码haha),是一个“整数1234,逆转后为4321”,当时第一眼的想法是:如果单纯要实现逆转的效果,那就放在数组里去实现功能,代码如下:
int [] arr={1,2,3,4};
int len=arr.length;
for(int i=0;i<len/2;i++){
int temp=arr[i];
arr[i]=arr[len-1];
arr[len-1]=temp;
}
为了输入任意整数,可以用(new Scanner(System.in).nextInt();)来实现,接着用循环(/10与%10)操作来获得整数各位上的数字,然后放入数组中执行上述代码,即可完成。于是在用上述想法敲完后,脑子顿出一个想法,若个位数为0的整数如“1230”则会变成“0123”,虽然“0123”和“123”的值是相同的,可是对于比较在意这些小细节来说,不太满意。因此就推倒重来,换个思路:既然1234=1×10×10×10+2×10×10+3×10+4;那么我就可以拆解4321=(((4+0)×10+3)×10+2)×10+1,新的代码①如下(long型是当时想比int更大的整数范围):
long reverse=0;
while(a!=0){//a是要输入的整数
long b=a%10;//循环体
long reverse=long((reverse+b)*10);//① 不过这样的一个不好的地方是最后逆转后扩大10倍,因此最后循环外面需要在/10的整型
a=a/10;//控制条件
}
long reverse=(long) (reverse/10);
System.out.println(reverse);
其实上述已经解决了数组的问题,至少看着运行的结果更顺眼些,在看了几个运行结果后,由于自己当时已经考虑了long型更大的取值范围,那么在上述代码行①的注解中,跳出循环的值会较实际逆转值扩大10倍(导致部分值逆转后本来没超long型的范围,可是却会报错),因此既然考虑了范围,那么这样会白白损失了一些值取不到,让我略微不满意,因此产生了这个版本的解法②:
long reverse=0;
while(a!=0){
long b=a%10;
reverse=reverse+b;
if(a/10!=0){// ② 添加if判断循环(/10)操作是否是个位数,如果是个位数则不执行if语句的(×10)的操作
reverse=reverse*10;
}
a=a/10;//控制条件 循环(/10)操作为了下次(%10)来获取数位上的各个数字
}
System.out.println(reverse);
}
}*/
对比①和②:②产生的对象个数并没有增加,另外②中 if(a/10!=0)判断的目的是最后一次不用(×10)可以对比4321=(((4+0)×10+3)×10+2)×10+1,最后一次操作只+了个位数1,有点类似递归(先+在×),最后一次仅作了+操作,那么利用这个 if(a/10!=0)来防止最后出现一个“畸形”的扩大10倍结果值,将错误扼杀在摇篮中,而这么来看的话,①中循环后的(/10)缩值操作只是来“擦屁股”的。当然②中确实多了几步判断运算,严格来说时间会多一丢丢,可是在正常的计算机中这些时间只是ms级别的,可以忽略不记,对于我这种“用户”感受会更好些。
也就是当时这件小事,让我对优化有了一定的认知,而且 if(a/10!=0)这种用法让我决定判断语句是如此的有趣和实用