leetcode easy刷題心得

持續更新html

67.二進制求和數組

給定兩個二進制,返回他們的和。輸入爲非空字符串而且只包含1和0.app

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的區別ide


69.x的平方根函數

實現int sqrt(int x)函數,返回整數x的平方根,只保留整數部分,小數部分將被捨去(如8開方後爲2.82842...,只留下2)oop

思路:使用二分搜索法(在下面)來找平方根ui

 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 }

 二分搜索法

一種常見的搜索方法,將線性時間提高到了對數時間,大大的縮短了搜索時間spa

參考連接.net

 


70.爬樓梯code

一次能夠爬一節或者兩節樓梯,求問第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--;
        }
    }
}

 

125.驗證迴文串(全)

136.只出現一次的數字

167.兩數之和II

168.Excel列表名。思路:模仿十進制

169.求衆數 

 204.計數質數

217.存在重複元素

public class Solution {
    public boolean containsDuplicate(int[] nums) {
        Arrays.sort(nums);   //Array.sort(數組);  對數組進行排序
        for(int i = 0; i < nums.length-1; i++) {
            if(nums[i] == nums[i+1]) {   //相鄰兩個數字等
                return true; 
            }
        }
        return false;
    }
}

 

219.存在重複元素2(hash map)


 

231.2的冪

查看一個數書否是2的冪,其中1也是。哇,這道題有好多思路哦

方法1:循環。。若是一個數是2的冪,那能夠一直除以2,知道得數爲1爲止。

public boolean isPowerOfTwo(int n){
    if(i == 1) return true;
   if((i>1)&&(i%2 == 0)){
    return isPowerOfTwo(n/2);
  }
   return false; }

 

方法2:對數法,見326【3的冪】那道題,只要看到冪!就能用對數!學到了沒有!(要用10爲底,不要用e爲底,容易溢出!)

class Solution {
    public boolean isPowerOfThree(int n) {
     double tem = Math.log10(n) / Math.log10(2); //log(N)是以e爲底的,logx(N)是以x爲底的,這裏要用以10爲底的哦,以e爲底,數字太大的話會溢出
        return (tem - (int)(tem)) == 0?true:false;
    }
}

 

方法3:二進制法。若是一個數是2的冪,那麼他的二進制只有第一位是1,剩下的位數都是0。

public boolean isPowerOfTwo(int n) {
        return (n>0)&&(countBit(n)==1);   //數字大於0且二進制只有一個1
    }
public int countBit(int num){ //計算二進制有幾個1 int count=0; while(num!=0){ count+=(num & 1); //位與運算符(&),見下
            num>>=1;
        }    
        return count;
    }

 

位與運算符(&)

運算規則:兩個數都轉爲二進制,而後從高位開始比較,若是兩個數都爲1則爲1,不然爲0。
好比:129&128.
129轉換成二進制就是10000001,128轉換成二進制就是10000000。從高位開始比較獲得,獲得10000000,即128.

 參考:https://www.cnblogs.com/yesiamhere/p/6675067.html

 

可是!二進制還有一種聰明方法:只能有最高位爲0

    public boolean isPowerOfTwo(int n) {
        if(n<=0)
            return false;
        return (n&(n-1))==0;  //return(n>0)&&(n&(n-1)==0);
    }

 


 【326】3的冪

Given an integer, write a function to determine if it is a power of three.

27 true  0 true  9 true  45 false 你是否能夠不用任何loop或者遞歸完成

 

思路1:採用對數的方法,一個數是3的冪方,那麼以3爲底n的對數必定是個整數。

class Solution {
    public boolean isPowerOfThree(int n) {
     double tem = Math.log10(n) / Math.log10(3); //log(N)是以e爲底的,logx(N)是以x爲底的,這裏要用以10爲底的哦,以e爲底,數字太大的話會溢出 return (tem - (int)(tem)) == 0?true:false;
    }
}

 【注意】Math.log只有三種關於log的使用方法:

static double log(double a)
返回(底數是 e)double 值的天然對數。

static double log10(double a)返回 double 值的底數爲 10 的對數。static double log1p(double x)返回參數與 1 的和的天然對數。
相關文章
相關標籤/搜索