持续更新
67.二进制求和
给定两个二进制,返回他们的和。输入为非空字符串并且只包含1和0.
class Solution { public String addBinary(String a, String b) { StringBuilder result = new StringBuilder(); //StringBuider是可以随时修改的,但String是不可修改的,所以StringBuider的速度比String快得多,详情见下。 int al = a.length()-1; int bl = b.length()-1; int carry = 0; while( al >=0 || bl >=0 ) { int sum = carry; if(al >= 0) { sum += (a.charAt(al) - '0'); al--; } if(bl >= 0) { sum += (b.charAt(bl) - '0'); bl--; } result.append(sum%2); //相加结果 carry = sum /2; //进位,如果是1那么carry=0,如果是2则要进位给下面一位+1 } if(carry !=0 ) //都相加完了,还要进位的情况 result.append(1); return result.reverse().toString(); //先反转,再输出 } }
参考链接:String,StringBuider和StringBuffer的区别
69.x的平方根
实现int sqrt(int x)函数,返回整数x的平方根,只保留整数部分,小数部分将被舍去(如8开方后为2.82842...,只留下2)
思路:使用二分搜索法(在下面)来找平方根
1 class Solution { 2 public int mySqrt(int x) { 3 if (x <= 1) return x; 4 int left = 0, right = x; 5 while (left < right) { 6 int mid = left + (right - left) / 2; 7 if (x / mid >= mid) left = mid + 1; 8 else right = mid; 9 } 10 return right - 1; 11 } 12 }
二分搜索法
一种常见的搜索方法,将线性时间提升到了对数时间,大大的缩短了搜索时间
70.爬楼梯
一次可以爬一节或者两节楼梯,求问第N节楼梯有几种不同的爬法(给出2节楼梯有两种爬法,三种楼梯有三种爬法)
思路:假如一共有n节楼梯,如何爬到第n节呢?因为每次只能爬一节或者两节,第n层不然就是从n-1层一步上来的,不然就是n-2层两步上来的,所以:sum[n]=sum[n-1]+sum[n-2]
1 class Solution { 2 public int climbStairs(int n) { 3 if(n==1)return 1; //如果只有一节楼梯,就只有一种爬法 4 int sum[]=new int[n+1]; //sum[n]是第n节楼梯有几种爬法 5 sum[0]=0;sum[1]=1;sum[2]=2; 6 for(int i=3;i<=n;i++){ 7 sum[i]=sum[i-2]+sum[i-1]; // 8 } 9 return sum[n]; 10 } 11 }
83.删除排序链表中的重复元素
链表
88.合并两个数组
将A、B两个数组的元素按大小合成一个数组
public class Solution { public void merge(int A[], int m, int B[], int n) { //直接在A中插入,把A拓展成一个m+n大小的数组 while(m > 0 && n >0){ if(A[m-1] > B[n-1]){ //A的最后一个和B的最后一个进行比较 A[m+n-1] = A[m-1]; m--; }else{ A[m+n-1] = B[n-1]; n--; } } while(n > 0){ //如果A的元素有剩余,不用管,放在原地即可 A[m+n-1] = B[n-1]; //如果B的元素有剩余,直接把B多出来的元素全部放入A中 n--; } } }