leetcode 150道题 计划花两个月时候刷完之未完成后转,今天(第3天)完成了3道(108-110)150
108.(201. 数字范围按位与) 题目描述:
给你两个整数 left 和 right ,表示区间 [left, right] ,返回此区间内所有数字 按位与 的结果(包含 left 、right 端点)。
第一版(我是第一时间考虑怎么缩小范围然后再去把范围内的所有数求 & 运算,能过但是效率肯定低)
class Solution {public int rangeBitwiseAnd(int left, int right) {int powNum=(int)(Math.log(left)/Math.log(2));int max=(int)(Math.pow(2,powNum+1));if(max<right){return 0;}max=right;int res=max;for(int m=left;m<max;m++){res&=m;}return res;}
}
第二版(看了解题求公共从1开始的字节就行,我在这个基础上加上我上面的缩小范围的判断)
class Solution {public int rangeBitwiseAnd(int left, int right) {int powNum=(int)(Math.log(left)/Math.log(2));int max=(int)(Math.pow(2,powNum+1));if(max<right){return 0;}int count=0;while(left<right){left>>=1;right>>=1;count++;}return left<<count;}
}
109.(9. 回文数)题目描述:
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
输入:x = 121
输出:true
输入:x = -121(负数都不是)
输出:false
第一版(这个 java 占大便宜,溢出不会报错。会转为负数,这个也是看了解题才知道。。)
class Solution {public boolean isPalindrome(int x) {if(x<0){return false;}int res=0;int num=x;// 反转时候 res已经溢出为负数了就可以直接退出了while(num!=0&&res>=0){res*=10;res+=(num%10);num=num/10;}return res==x;}
}
110.(66. 加一)题目描述:
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
第一版(这个题我有印象的记得第一次考虑好多。。写的好复杂。。这次就很随意,它主要是只是加一,这个明白了就很简单)
class Solution {public int[] plusOne(int[] digits) {for(int i=digits.length-1;i>=0;i--){if(digits[i]==9){digits[i]=0;}else{digits[i]++;return digits;}}int[] res=new int[digits.length+1];res[0]=1;return res;}
}
催婚、催婚、年轻人的悲哀啊!!!
好好学习吧,自己不适合。