【LeetCode】初級演算法:字串

widiot1發表於2018-05-10

題目可以在LeetCode檢視

1. 反轉字串

用時:3ms

class Solution {
    public String reverseString(String s) {
	    // 用時:4ms
        // StringBuilder sb=new StringBuilder();
        // for(int i=s.length()-1;i>=0;--i){
        //     sb.append(s.charAt(i));
        // }
        // return sb.toString();
        
        return new StringBuilder(s).reverse().toString();
    }
}

2. 顛倒整數

用時:31ms

class Solution {
    public int reverse(int x) {
        boolean negative = x < 0;
        if (negative){
            x = -x;
        }
        long r = 0;
        while (x>0) {
            r = r * 10 + x % 10;
            x /= 10;
        }
        if (negative){
            r = -r;
        }
        if (r > Integer.MAX_VALUE || r < Integer.MIN_VALUE){
            return 0;
        }
        return (int)r;
    }
}

3. 字串中的第一個唯一字元

用時:43ms

class Solution {
    public int firstUniqChar(String s) {
        int len=s.length();
        HashSet<Character> repeat=new HashSet<>();
        Character temp;
        boolean find=false;
        // 一個一個比較如果不重複則找到
        for(int i=0;i<len;++i){
            temp=s.charAt(i);
            if(!repeat.contains(temp)){
                find=true;
                for(int j=i+1;j<len;++j){
                    if(temp.equals(s.charAt(j))){
                        find=false;
                        break;
                    }
                }
            }
            if(find){
                return i;
            }else{
                repeat.add(temp);
            }
        }
        return -1;
    }
}

4. 有效的字母異位詞

用時:9ms

class Solution {
    public boolean isAnagram(String s, String t) {
        int len=s.length();
        if(len!=t.length()){
            return false;
        }
        // s有某字母則加1,t有則減一,最終都為0
        int[] words=new int[26];
        for(int i=0;i<len;++i){
            ++words[s.charAt(i)-97];
            --words[t.charAt(i)-97];
        }
        for(int i:words){
            if(i!=0){
                return false;
            }
        }
        return true;
    }
}

5. 驗證迴文字串

用時:31ms

class Solution {
    public boolean isPalindrome(String s) {
        // 只留下字母和數字
        s=s.replaceAll("[^a-zA-Z0-9]","");
        // 忽略大小寫比較
        StringBuilder reverse=new StringBuilder(s).reverse();
        if(s.equalsIgnoreCase(reverse.toString())){
            return true;
        }
        return false;
    }
}

6. 字串轉整數(atoi)

用時:30ms

class Solution {
    public int myAtoi(String str) {
        int len=str.length();
        // 找到第一個非空格
        int i=0;
        while(i<len&&str.charAt(i)==' '){
            ++i;
        }
        
        // 如果i溢位則為空串或空格
        if(i==len){
            return 0;
        }
        
        // 判斷第一個字元是正負號、非數字
        char temp=str.charAt(i);
        boolean neg=false;
        if(temp=='-'||temp=='+'){
            neg=(temp=='-'?true:neg);
            ++i;
        }else if(temp<48&&temp>57){
            return 0;
        }
        
        // 正負號是末尾字元
        if(i==len){
            return 0;
        }
        
        // 將數字提取出來
        StringBuilder numStr=new StringBuilder();
        temp=str.charAt(i);
        while(temp>=48&&temp<=57){
            numStr.append(temp);
            if(++i>=len){
                break;
            }
            temp=str.charAt(i);
        }
        
        // 去除前面的0
        while(numStr.length()!=0&&numStr.charAt(0)=='0'){
            numStr.deleteCharAt(0);
        }
        
        // 如果為空串
        if(numStr.length()==0){
            return 0;
        }
        
        // 如果長度太長則直接返回最值
        if(numStr.length()>=11){
            if(neg){
                return Integer.MIN_VALUE;
            }
            return Integer.MAX_VALUE;
        }
        
        // 轉為long
        Long num=Long.valueOf(numStr.toString());
        if(neg){
            num=-num;
        }
        if(num<Integer.MIN_VALUE){
            return Integer.MIN_VALUE;
        }else if(num>Integer.MAX_VALUE){
            return Integer.MAX_VALUE;
        }
        return num.intValue();
    }
}

7. 實現strStr()

用時:5ms

class Solution {
    public int strStr(String haystack, String needle) {
        int len1=haystack.length(),len2=needle.length();
        if(len2==0){
            return 0;
        }
        int i=0;
        char first=needle.charAt(0);
        // 直接比較子串
        while(i<=(len1-len2)){
            if(needle.equals(haystack.substring(i,len2+i))){
                return i;
            }
            ++i;
        }
        return -1;
    }
}

8. 數數並說

用時:5ms

class Solution {
    // 儲存上一次的序列和n,用於直接從這一次開始
    public static StringBuilder startsb=new StringBuilder("1");
    public static int startn=1;

    public String countAndSay(int n) {
        StringBuilder presb=new StringBuilder("1");
        StringBuilder cursb=new StringBuilder();
        int i=0;
        // 如果n大於上一次的n,則可以直接從上一次開始
        if(n>=startn){
            presb.replace(0,presb.length(),startsb.toString());
            i=startn-1;
        }
        // 統計字元及其個數
        int count;
        char num;
        while(i<n-1){
            for(int m=0;m<presb.length();m+=count){
                num=presb.charAt(m);
                count=1;
                for(int j=m+1;j<presb.length();++j){
                    if(num==presb.charAt(j)){
                        ++count;
                    }else{
                        break;
                    }
                }
                cursb.append(String.valueOf(count));
                cursb.append(num);
            }
            presb.replace(0,presb.length(),cursb.toString());
            cursb.delete(0,cursb.length());
            ++i;
        }
        if(n>startn){
            startsb.replace(0,startsb.length(),presb.toString());
            startn=n;
        }
        return presb.toString();
    }
}

9. 最長公共字首

用時:9ms

class Solution {
    public String longestCommonPrefix(String[] strs) {
        int len1=strs.length;
        if(len1==0){
            return "";
        }
        int len2=strs[0].length();
        int count=0;
        char temp;
        boolean find;
        for(int i=0;i<len2;++i){
            temp=strs[0].charAt(i);
            find=true;
            for(int j=1;j<len1;++j){
                try{
                    if(temp!=strs[j].charAt(i)){
                        find=false;
                        break;
                    }
                }catch(Exception e){
                    find=false;
                    break;
                }
            }
            if(!find){
                break;
            }
            ++count;
        }
        return strs[0].substring(0,count);
    }
}

相關文章