leetcode-重新排列数组、整数反转、回文数

重新排列数组

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值