算法是码农的基本功,也是各个大厂必考察的重点,让我们一起坚持写题吧。
遇事不决,可问春风,春风不语,即是本心。
我们在我们能力范围内,做好我们该做的事,然后相信一切都事最好的安排就可以啦,慢慢来,会很快,向前走,别回头。
目录
1、加一
思路:根据数组从后先前遍历,每次累加1,如果小于10,则直接返回数组,否则,对当前数组元素取余。退出循环的时候说明是类似于999这种,需要就对数组进行扩容1。
class Solution {
public int[] plusOne(int[] digits) {
for(int i=digits.length-1; i>=0; i--){
digits[i] ++ ;
if(digits[i] < 10){
return digits ;
}
digits[i] %= 10 ;
}
int [] digit = new int[digits.length+1] ;
digit[0] = 1 ;
for(int i=0; i<digits.length; i++){
digit[i+1] = digits[i] ;
}
return digit ;
}
}
2、二进制求和
思路:模拟两个二进制数进行求和,用字符串a和字符串b的值以及进位值进行求和,按照三种情况进行拼接字符串,每次需要记录进位值。
class Solution {
public String addBinary(String a, String b) {
int i = a.length()-1, j = b.length()-1, add = 0 ;
StringBuilder sb = new StringBuilder("") ;
while(i>=0 || j>=0 || add != 0){
// 模拟字符串a和b当前值
int x = i>=0 ? a.charAt(i) - '0' : 0 ;
int y = j>=0 ? b.charAt(j) - '0' : 0 ;
int ans = x + y + add ;
// 模拟进位值
add = (ans == 0 || ans == 1) ? 0 : 1 ;
if(ans == 0 || ans == 1){
sb.append(ans+"") ;
}else if(ans == 2){
sb.append("0") ;
}else if(ans == 3){
sb.append("1") ;
}
i -- ;
j -- ;
}
return sb.reverse().toString() ;
}
}
3、文本左右对球
略
4、x的平方根
思路:利用api,或者二分查找法
class Solution {
public int mySqrt(int x) {
return (int) Math.sqrt(x) ;
}
}
二分查找:初始化左边界值为0,右边界值为x,结果值为-1,每次使用中间值进行对比,不断更新左右边界值更新结果值。
class Solution {
public int mySqrt(int x) {
int left = 0, right = x, ans = -1 ;
while(left <= right){
int mid = (left + right) >> 1 ;
if((long) mid * mid <= x){
ans = mid ;
left = mid + 1 ;
}else{
right = mid - 1 ;
}
}
return ans ;
}
}
5、爬楼梯
思路:递归or递推
class Solution {
public int climbStairs(int n) {
if(n==1){
return 1 ;
}
int [] dp = new int [n] ;
dp[0] = 1 ;
dp[1] = 2 ;
for(int i=2; i<n; i++){
dp[i] = dp[i-1] + dp[i-2] ;
}
return dp[n-1] ;
}
}