leetcode刷題記錄5-10

6. Z 字形變換
將一個給定字符串根據給定的行數,以從上往下、從左到右進行 Z 字形排列。
比如輸入字符串爲 “LEETCODEISHIRING” 行數爲 3 時,排列如下:
L   	C  	 I   		RE T 	O E	 S 	I	 I	 GE  	D  	 H   		N
之後,你的輸出需要從左往右逐行讀取,產生出一個新的字符串,比如:“LCIRETOESIIGEDHN”。

請你實現這個將字符串進行指定行數變換的函數:
string convert(string s, int numRows);

示例 1:
輸入: s = “LEETCODEISHIRING”, numRows = 3
輸出: “LCIRETOESIIGEDHN”
示例 2:
輸入: s = “LEETCODEISHIRING”, numRows = 4
輸出: “LDREOEIIECIHNTSG”
解釋:
在這裏插入圖片描述

這裏我踩到了一個坑:StringBuffer[] b=new StringBuffer[numRows];並沒有將StringBuffer的具體對象創建出來,仍需要b[i]=new StringBuffer();創建對象。
解題代碼:

	public String convert(String s, int numRows) {
       StringBuffer[] b=new StringBuffer[numRows]; 
       Boolean status=true;
       int now=0;
       for(int i=0;i<b.length;i++){
			b[i]=new StringBuffer();
		}
       for(int i=0;i<s.length();i++){
           b[now].append(s.charAt(i));
           if(now==0){
               status=true;
               if(now==numRows-1){
					continue;
				}
           }
           if(now==numRows-1){
               status=false;
           }
           if(status){
               now++;
           }else{
               now--;
           }
       }
       StringBuffer str=new StringBuffer();
       for(int i=0;i<b.length;i++){
           if(b[i]!=null){
                str.append(b[i]);
           }
       }
       return str.toString();
    }

7. 整數反轉
給出一個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。
注意:
假設我們的環境只能存儲得下 32 位的有符號整數,則其數值範圍爲 [−231, 231 − 1]。請根據這個假設,如果反轉後整數溢出那麼就返回 0。

示例 1:
輸入: 123
輸出: 321
示例 2:
輸入: -123
輸出: -321
示例 3:
輸入: 120
輸出: 21

可以使用(int)n==n判斷n是否溢出
解題代碼:

 	public int reverse(int x) {
        long n = 0;
        while(x != 0) {
            n = n*10 + x%10;
            x = x/10;
        }
        return (int)n==n? (int)n:0;
    }

8. 字符串轉換整數
請你來實現一個 atoi 函數,使其能將字符串轉換成整數。
首先,該函數會根據需要丟棄無用的開頭空格字符,直到尋找到第一個非空格的字符爲止。
當我們尋找到的第一個非空字符爲正或者負號時,則將該符號與之後面儘可能多的連續數字組合起來,作爲該整數的正負號;假如第一個非空字符是數字,則直接將其與之後連續的數字字符組合起來,形成整數。
該字符串除了有效的整數部分之後也可能會存在多餘的字符,這些字符可以被忽略,它們對於函數不應該造成影響。
注意:假如該字符串中的第一個非空格字符不是一個有效整數字符、字符串爲空或字符串僅包含空白字符時,則你的函數不需要進行轉換。
在任何情況下,若函數不能進行有效的轉換時,請返回 0。
說明:
假設我們的環境只能存儲 32 位大小的有符號整數,那麼其數值範圍爲 [−231, 231 − 1]。如果數值超過這個範圍,請返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。

示例 1:
輸入: “42”
輸出: 42
示例 2:
輸入: " -42"
輸出: -42
解釋: 第一個非空白字符爲 ‘-’, 它是一個負號。
我們儘可能將負號與後面所有連續出現的數字組合起來,最後得到 -42 。
示例 3:
輸入: “4193 with words”
輸出: 4193
解釋: 轉換截止於數字 ‘3’ ,因爲它的下一個字符不爲數字。
示例 4:
輸入: “words and 987”
輸出: 0
解釋: 第一個非空字符是 ‘w’, 但它不是數字或正、負號。因此無法執行有效的轉換。
示例 5:
輸入: “-91283472332”
輸出: -2147483648
解釋: 數字 “-91283472332” 超過 32位有符號整數範圍。因此返回 INT_MIN (−231) 。

解題代碼

	public int myAtoi(String str) {
        if(str.equals("")){
            return 0;
        }
        String[] c=str.split("");
		StringBuffer s=new StringBuffer();
		boolean status=true,size=true;
		for(String ch:c){
			if(status){
				if(ch.equals("+")){
					status=false;
					continue;
				}
                if(ch.equals("-")){
                    status=false;
                    size=false;
					continue;
                }
				if(ch.charAt(0)>=48&&ch.charAt(0)<58){
					if(ch.charAt(0)!=48){
						s.append(ch);
					}
					status=false;
					continue;
				}
				if(ch.charAt(0)!=32){
					return 0;
				}
			}else{
				if(ch.charAt(0)>=48&&ch.charAt(0)<58){
					if(ch.charAt(0)==48&&s.length()<1){
						continue;
					}
					s.append(ch);
				}else{
					break;
				}
			}
		}
		try{
            if(s.length()<1){
                return 0;
            }
            if(size){
				return Integer.parseInt(s.toString());
			}else{
				return -Integer.parseInt(s.toString());
			}
		}catch (Exception e){
			if(size){
				return 2147483647;
			}else{
				return -2147483648;
			}
		}
    }

9. 迴文數
判斷一個整數是否是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。
進階:
你能不將整數轉爲字符串來解決這個問題嗎?

示例 1:
輸入: 121
輸出: true
示例 2:
輸入: -121
輸出: false
解釋: 從左向右讀, 爲 -121 。 從右向左讀, 爲 121- 。因此它不是一個迴文數。
示例 3:
輸入: 10
輸出: false
解釋: 從右向左讀, 爲 01 。因此它不是一個迴文數。

可以確認所有負數都不是迴文數,可以先排除
解題代碼:

	public boolean isPalindrome(int x) {
        if(x<0){
            return false;
        }
        int y=0,z=x;;
        while(z>0){
            y=y*10+z%10;
            z/=10;
        }
        if(x==y){
            return true;
        }else{
            return false;
        }
    }

10. 正則表達式匹配
給你一個字符串 s 和一個字符規律 p,請你來實現一個支持 ‘.’ 和 ‘*’ 的正則表達式匹配。

‘.’ 匹配任意單個字符
‘*’ 匹配零個或多個前面的那一個元素

所謂匹配,是要涵蓋 整個 字符串 s的,而不是部分字符串。

說明:
s 可能爲空,且只包含從 a-z 的小寫字母。
p 可能爲空,且只包含從 a-z 的小寫字母,以及字符 . 和 *。

示例 1:
輸入:
s = “aa”
p = “a”
輸出: false
解釋: “a” 無法匹配 “aa” 整個字符串。
示例 2:
輸入:
s = “aa”
p = “a*”
輸出: true
解釋: 因爲 ‘’ 代表可以匹配零個或多個前面的那一個元素, 在這裏前面的元素就是 ‘a’。因此,字符串 “aa” 可被視爲 ‘a’ 重複了一次。
示例 3:
輸入:
s = “ab”
p = ".
"
輸出: true
解釋: "." 表示可匹配零個或多個(’’)任意字符(’.’)。
示例 4:
輸入:
s = “aab”
p = “cab”
輸出: true
解釋: 因爲 '’ 表示零個或多個,這裏 ‘c’ 爲 0 個, ‘a’ 被重複一次。因此可以匹配字符串 “aab”。
示例 5:
輸入:
s = “mississippi”
p = "mis
isp."
輸出: false

此題我參考了官方給出的回溯法,我理解爲題目走向是一個三叉樹,第一個if判斷是否得到答案,第二個if判斷走向哪個分支,match判斷該分支是否要繼續走下去。
單看代碼理解比較困難,使用debug調試更易理解。

解題代碼:

	public boolean isMatch(String s, String p) {
        if (p.isEmpty()) return s.isEmpty();
        boolean match = (!s.isEmpty() && (p.charAt(0) == s.charAt(0) || p.charAt(0) == '.'));

        if (p.length() >= 2 && p.charAt(1) == '*'){
            return (isMatch(s, p.substring(2))||(match && isMatch(s.substring(1), p)));
        } else {
            return match && isMatch(s.substring(1), p.substring(1));
        }

    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章