1. 程式人生 > >LeetCode刷題第一天

LeetCode刷題第一天

今天刷了4道 LeetCode題,分別是:

  1. 1-bit and 2-bit Characters

    We have two special characters. The first character can be represented by one bit 0. The second character can be represented by two bits (10 or 11).

    Now given a string represented by several bits. Return whether the last character must be a one-bit character or not. The given string will always end with a zero.

  2. Add Strings :bigInteger
  3. Array Partition I : Given an array of 2n integers, your task is to group these integers into n pairs of integer, say (a1, b1), (a2, b2), ..., (an, bn) which makes sum of min(ai, bi) for all i from 1 to n as large as possible.
  4. Backspace String Compare :Given two strings S
     and T, return if they are equal when both are typed into empty text editors. # means a backspace character.

對於第一題  1-bit and 2-bit Characters,難點在於需要仔細的分析問題的關鍵(思考過程需要從最後向前算,而且著重點在於找規律,如果找不出規律可以先舉例子再歸納; 思考過程也可以從頭向後看,需要分析的是,只要有1一定是2bit;)。

Solution1:從尾到頭開始分析。需要注意的是不會存在01的組合,因此和末尾的0相鄰的1出現的奇偶次數格外重要。

class Solution {
    public boolean isOneBitCharacter(int[] bits) {
        int length=bits.length;
        int count=0;
        if(bits[length-1]!=0){
            return false;
        }else{
            for(int i=length-2;i>=0 && bits[i]==1;i--){
                count++;
            }
        }
        if(count % 2 == 0){
            return true;
        }else{
            return false;
        }
    }
}

Solution2:從頭到尾分析,可以發現從頭起第一個0肯定是1bit,因為不會有01組合,那麼接下來出現的1肯定是2bit。那麼有一個方法就是設定一個指標來從頭開始,遇到0就向前走1步,遇到1就向前走2步。如果最後一個0是1bit,那麼指標會恰好停在0的index,如果最後一個0是2bit,那麼指標會大於最後一個0的index,即index+1;

class Solution {
    //這種方法很巧妙,需要在程式設計中學習並思考這種方法,pointer
    public boolean isOneBitCharacter(int[] bits) {
        int pointer=0;
        while(pointer<bits.length-1){
            pointer+=bits[pointer]+1;
        }
        return pointer==(bits.length-1);     
    }
}

對於第二題,Add Strings,大數加法;

Tip:如果直接輸出str.charAt(),可以正常輸出char字元,而不是ASCII碼;如果和字串相接,也是可以正常輸出char字元,而不是ASCII;只有一種情況,但是如果把str.charAt()即char型別當成int進行計算,那麼它將自動使用對應的ASCII來進行計算;比如'0'的ASCII為48;

Solution1:常規思維,先把兩個陣列倒序,長度短的後面補0。然後按index把每一位相加,結果保留,有進位的話在下一位相加時多加1,最後把這些字串連起來就是結果。

Solution2: 思維方法和上面相似,程式碼上可以更加精簡。不需要倒序,直接使用for迴圈倒著遍歷,並且合併兩個for迴圈到一個for迴圈上。最後有一點注意的是,每一位相加的結果  result%10 就是需要儲存的,result / 10就是代表是否需要進位的。

class Solution {
    public String addStrings(String num1, String num2) {
        int overFlow=0;
        StringBuffer res= new StringBuffer();
        for(int i=num1.length()-1,j=num2.length()-1;i>=0 || j>=0 || overFlow==1; i--,j--){
            int wei1= i<0 ? 0: num1.charAt(i)-'0';
            int wei2= j<0 ? 0: num2.charAt(j)-'0';
            int append= (wei1 + wei2 + overFlow) % 10;
            res.append(append);
            overFlow= (wei1 + wei2 + overFlow) / 10;
        }
        return res.reverse().toString();
        
    }
}

對於第三題,Array Partition I,實際上就是排序演算法,先把陣列排序後,取奇數index所對應的值的和就是最終結果。

我使用了快排。

class Solution {
    public int arrayPairSum(int[] nums) {
        quickSort(nums);
        int sum=0;
        for(int i=0;i<nums.length;i+=2){
            sum+=nums[i];
        }
        return sum;
    }
    public static void quickSort(int[] arr){
    qsort(arr, 0, arr.length-1);
}
private static void qsort(int[] arr, int low, int high){
    if (low < high){
        int pivot=partition(arr, low, high);        //將陣列分為兩部分
        qsort(arr, low, pivot-1);                   //遞迴排序左子陣列
        qsort(arr, pivot+1, high);                  //遞迴排序右子陣列
    }
}
private static int partition(int[] arr, int low, int high){
    int pivot = arr[low];     //樞軸記錄
    while (low<high){
        while (low<high && arr[high]>=pivot) --high;
        arr[low]=arr[high];             //交換比樞軸小的記錄到左端
        while (low<high && arr[low]<=pivot) ++low;
        arr[high] = arr[low];           //交換比樞軸小的記錄到右端
    }
    //掃描完成,樞軸到位
    arr[low] = pivot;
    //返回的是樞軸的位置
    return low;
}
}

對於第四題,Backspace String Compare , 自己的想法是可以用棧的結構來做,但是結果執行速度不夠理想。然後使用了暴力法,發現速度比棧的做法快。

List<Character>  是char型別的List,List中的型別都必須是包裝類,不能為原始型別如char,int;
如果用原始型別會報錯:Syntax error, insert "Dimensions" to complete ReferenceType;

class Solution {
    
    public boolean backspaceCompare(String S, String T) {
        StringBuffer str1= new StringBuffer();
        StringBuffer str2= new StringBuffer();
        List<Character> results1=new ArrayList<Character>();
        List<Character> results2=new ArrayList<Character>();

        for(int i=0;i<S.length();i++){
            if(S.charAt(i) == '#'){
                pop(results1);
            }else{
                push(S.charAt(i),results1);
            }
        }
        for(int i=0;i<T.length();i++){
            if(T.charAt(i) == '#'){
                pop(results2);
            }else{
                push(T.charAt(i),results2);
            }
        }
        for(char c:results1){
            str1.append(c);
        }
        for(char c:results2){
            str2.append(c);
        }
        
        return str1.toString().equals(str2.toString());
    }
    
    public void push(char c,List results){
        results.add(c);
    }
    
    public void pop(List results){
        if(results.size()==0)
            return;
        results.remove(results.size()-1);
    }
    
}

方法2

class Solution {
    
    public boolean backspaceCompare(String S, String T) {
        int maxLength= S.length()>T.length() ? S.length() : T.length();
        StringBuffer str1=new StringBuffer();
        StringBuffer str2=new StringBuffer();

        for(int i=0;i<maxLength;i++){
            if(i<S.length()){
            if(S.charAt(i)=='#'){
                if(str1.length()!=0){
                  str1.deleteCharAt(str1.length()-1);
                }
            }else{
                str1.append(S.charAt(i));
            }
            }
            if(i<T.length()){
            if(T.charAt(i)=='#'){
                if(str2.length()!=0){
                  str2.deleteCharAt(str2.length()-1);
                }
            }else{
                str2.append(T.charAt(i));
            }
            }
        }
        
        return str1.toString().equals(str2.toString());
       
    }
    
}

相關推薦

LeetCode第一

今天刷了4道 LeetCode題,分別是: 1-bit and 2-bit Characters : We have two special characters. The first character can be represented by one bit 0.

LeetCode算法--第一

ive strong targe 方案 imp string color not ces Given an array of integers, return indices of the two numbers such that they add up to a spe

綜合第一

1.線性表若採用鏈式儲存結構時,要求記憶體中可用儲存單元的地址?(連續不連續都可以) 解析:鏈式儲存結構和順序儲存結構相比較,最大的優點是,地址不連續,操作靈活 但是一般Malloc和new是不連續的。 2.某二叉樹的前序遍歷序列與中序遍歷序列相同,均為 ABCDEF ,則按層次輸出(同一層

LeetCode——第一 (兩數之和)

1.兩數之和 題目描述 思路 程式碼實現 可能出現的問題 題目描述 給定一個整數陣列 nums 和一個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。 你可以假設每種輸入只會對應一

第一各種蒙圈

今天刷了兩道簡單題,全是string,隨即就各種蒙圈…… 總結一下今天遇到的知識點吧,恐怕是沒有時間全部認真寫了。 1、神奇的vector操作 push_back、size(不同於陣列的sizeof,關於sizeof的大小到底是什麼大小,還要再考證一下) 2、string和vector也算是差不多的東

leetcode第一

1.two sum: 解法一: function sum(arr,target){             var len = arr.length;             for(var i=0;i<len;i++){                 for(v

LeetCode記錄(第一

Jewels and Stones原題目:You're given strings J representing the types of stones that are jewels, and S representing the stones you have.  Eac

C#LeetCode之#278-第一個錯誤的版本(First Bad Version)

問題 你是產品經理,目前正在帶領一個團隊開發新的產品。不幸的是,你的產品的最新版本沒有通過質量檢測。由於每個版本都是基於之前的版本開發的,所以錯誤的版本之後的所有版本都是錯的。 假設你有 n 個版本 [1, 2, ..., n],你想找出導致之後所有版本出錯的第一個錯誤的版本。 你可

LeetCode之路(第二

5.最長迴文子串 給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為1000。 示例 1: 輸入: “babad” 輸出: “bab” 注意: "aba"也是一個有效答案。 示例 2: 輸入: “cbbd” 輸出: “bb” 這個演算

LeetCode之路(第三

10. 正則表示式匹配 給定一個字串 (s) 和一個字元模式 §。實現支援 ‘.’ 和 ‘*’ 的正則表示式匹配。 ‘.’ 匹配任意單個字元。 ‘*’ 匹配零個或多個前面的元素。 匹配應該覆蓋整個字串 (s) ,而不是部分字串。 說明: s 可能為空,且只包含

LeetCode之387Python字串中的第一個唯一字元

題目: 給定一個字串,找到它的第一個不重複的字元,並返回它的索引。如果不存在,則返回 -1。 案例: s = "leetcode" 返回 0. s = "loveleetcode", 返回 2. 注意事項:您可以假定該字串只包含小寫字母。 我的解答: 先計數,

LeetCode記錄——第387(字串中的第一個唯一字元)

題目描述 給定一個字串,找到它的第一個不重複的字元,並返回它的索引。如果不存在,則返回 -1。 案例: s = “leetcode” 返回 0. s = “loveleetcode”, 返回 2. 思路分析 關鍵問題在於,如何找到第一個不重複字元

第一leetcode

lincode的測試不需要自己進行輸入輸出,可以直接編寫函式等待測試 #關於python的函式,self 還不懂 類中定義函式,必須要有self作第一引數 python的for迴圈不需要i為整數,可以直接迴圈變數 迭代邏輯。。 函式邏輯:def,return 有if的情況下,可以分開多次

LeetCode——字串中的第一個唯一字元

大家好,結束了五一假期,繼續刷題日記。本次題目要求如下:我的思路是這樣的:首先計算出s的長度並將s複製給一個字串cont,進入while迴圈,知道字串s為空,使用.find()函式尋找字串裡是否有與s[0]相同的字元若有,使用remove函式把所有與s[0]相同的字元包括s[

LeetCode第一——TwoSum

Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum should return indices

LeetCode第一——Add Two Numbers

You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes cont

LeetCode記錄(第五

Trapping Rain Water原題目:Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much wate

LeetCode記錄(第六

Swap Salary這道題竟然是一個sql題,雖然經常寫sql和看關於mysql的效能優化,但是我發現一個大問題,我都白學來。。。。題目:Given a table salary, such as the one below, that has m=male and f=f

leetcode第三<無重復字符的最長子串>

子串 由於 break 垃圾 lee pre tco wke 第三天 給定一個字符串,請你找出其中不含有重復字符的 最長子串 的長度。 示例 1: 輸入: "abcabcbb" 輸出: 3 解釋: 因為無重復字符的最長子串是 "abc",所以其長度為 3。 示例 2:

#leetcode之路41-缺失的第一個正數

ostream == return pac ssi n) continue etc mes 給定一個未排序的整數數組,找出其中沒有出現的最小的正整數。示例 1:輸入: [1,2,0]輸出: 3示例 2:輸入: [3,4,-1,1]輸出: 2示例 3:輸入: [7,8,9,1