重新排列数组
class Solution {
public int[] shuffle(int[] nums, int n) {
int[] shuffle = new int[n*2];
for(int i = 0; i<n; i++){
shuffle[i*2] = nums[i];
shuffle[i*2+1] = nums[i+n];
}
return shuffle;
}
}
这里要注意shuffle[i*2]
和shuffle[i*2+1]
,i=0时为0和1,i=1时为2和3,是需要找规律的。
这一部分还有另一种写法:
public class Rerange {
public int[] shuffle(int[] nums, int n) {
int[] shuffle = new int[n*2];
int index = 0;
for(int i = 0; i<n; i++){
shuffle[index++] = nums[i];
shuffle[index++] = nums[i+n];
}
return shuffle;
}
}
这里起初int index = 0;
当i=0时,shuffle[index++] = nums[i];
index=1,是不是导致nums[0]赋值给了shuffle[1]?
但是实验后发现不是:
public class Test {
public static void main(String[] args) {
Rerange re = new Rerange();
int[] nums =new int[]{2,5,1,3,4,7};
int n = 3;
int [] shu = re.shuffle(nums,n);
System.out.println(shu[0]);
}
}
运行结果为2.
原因?
index++是先赋值,再加加,所以是0
++,–运算符后置时,先使用变量index原有值参与运算操作,运算操作完成后,变量的值自增1或者自减1;
++,–运算符前置时,先将变量index的值自增1或者自减1,然后使用更新后的新值参与运算操作;
整数反转
class Solution {
public int reverse(int x) {
int rev = 0;
int tmp = 0;
while(x!=0){
if(rev>(Math.pow(2,31)-1) || rev<(-Math.pow(2,31))){
return 0;
}
else{
tmp = x%10;
x = x/10;
rev = rev*10+tmp;
}
}
return rev;
}
}
起初是这样写的,提交发现有溢出的情况。因为要阻止溢出,所以必须在溢出前就进行判断。即在倒数第二位。
2的31次方是2 147 483 648,可以直接写进去。
修改后的代码:
class Solution {
public int reverse(int x) {
int rev = 0;
int tmp = 0;
while(x!=0){
tmp = x%10;
if(rev<-214748364 || rev==-214748364 && tmp>8){
return 0;
}
if(rev>214748364 || rev==214748364 && tmp>7){
return 0;
}
x = x/10;
rev = rev*10+tmp;
}
return rev;
}
}
另外要注意,在比较的时候,十位大了肯定大,十位等了还要比较各位,正负都要比较。
回文数
这个没有溢出的问题
class Solution {
public boolean isPalindrome(int x) {
int tmp = 0;
int rev = 0;
int old = x;
if(x<0){
return false;
}
if(x==0){
return true;
}
while(x>0){
tmp = x%10;
x=x/10;
rev = rev*10+tmp;
}
if(rev == old){
return true;
}else{
return false;
}
}
}
这一部分可以优化
//if(rev == old){
// return true;
// }else{
// return false;
// }
//直接写
return rev == old;
另外可以用stringbuilder,reverse string。