1. 程式人生 > >java細節知識(leetcode刷題(一))

java細節知識(leetcode刷題(一))

1.leetcode344

​
str2 = new StringBuffer(str2).reverse().toString();
StringBuilder rev = new StringBuilder();rev.toString();
String orig;char[] s = orig.toCharArray();
char[] s;String st=new String(s);st=s.toString();

​

2.136

對於任何數x,都有x^x=0,x^0=x

Java:return 必須在合適的位置,不能再迴圈裡面;break也只能用一次。

3 .

list可以有重複,set不可以有重複的,如果發現有重複的,則不會新增。hashset可以取代arraylist。

map:hashmap就是鍵值和值(key和value),多個鍵可以對應一個value,但是一個key不能多對應多個value。

arraylist也可以sort,但是需要繼承comparable介面,也可以繼承comparator類。

4.104

這道題也可以用,遞迴的方法做,但是比較難理解,用層序遍歷(即圖的廣度優先遍歷)比較好理解。

LinkedList在這這裡是作為佇列,add()==addLast(),poll()==poll(),push()==addFirst()

LinkedList可以作為佇列或是棧使用,但是ArrayList只是作為一個可以動態變化大小的陣列。

class Solution {
    public int maxDepth(TreeNode root) {
        LinkedList<TreeNode> ar=new LinkedList<TreeNode>();
        ar.push(root);
        int level=0;
        int nextnum=0;
        int curnum=1;
        while(!ar.isEmpty())
        {
            TreeNode current=ar.pop();//放在迴圈以外就不行了,注意程式碼的區域性性吧
            curnum--;
            if(current.left!=null)
            {
                ar.push(current.left);
                nextnum++;
            }
            if(current.right!=null)
            {
                ar.push(current.right);
                nextnum++;
            }
            if(curnum==0)
            {
                level++;
                curnum=nextnum;
                nextnum=0;
                 
            }
        }
        return level;
        

    }
}

還有一種方法,遞迴的方法。

class Solution {
    public int maxDepth(TreeNode root) {
         if(root==null)
            return 0;
        int left=maxDepth(root.left);
        int right=maxDepth(root.right);
        return left>right?(left+1):(right+1);
        
    }
}

5.283 move zeros

int len = nums.length;
        int idx = 0;
        for(int i = 0; i < len; i ++)
        {
            if(nums[i]!=0) {
                nums[idx ++] = nums[i];
            }
        }
        for(int i = idx; i < len; i ++)
            nums[i] = 0;

6.反轉連結串列 206

錯誤例子(不知道哪裡錯了),p 是多餘的,而且不能保證c不為null,

 public ListNode reverseList(ListNode head) {
        
        ListNode p=head;
        ListNode c=head.next;
        ListNode n=c.next;
        head.next=null;
        while(c!=null)
        {
            c.next=p;
            p=c;
            c=n;
            if(n!=null)
            {
               n=n.next;
            }
            head=p;
            
        }
        return head;
    }

正確例子

ss Solution {
    public ListNode reverseList(ListNode head) {
        if(head==null)
            return head;
        
        ListNode pre=head.next;
        ListNode cur=null;
        while(head!=null)
        {
            head.next=cur;
            cur=head;
            head=pre;
            if(head!=null)
               pre=head.next;
            
        }
        return cur;

}

7.171

int l=s.length();
        int r=0;
        for(int i=0;i<l;i++)
        {
            r=r+((int)s.charAt(i)-(int)'A'+1)*(int)Math.pow((double)26,(double)l-i-1);
        }
        return r;

8. 169 arrays這個類之後可以再學一些用法

Arrays.sort(num);
        return num[num.length/2];

9.題13,注意HashMap的用法。主要就put和get,還有size(),containsKey(),containsValue().

 public int romanToInt(String s) {
        HashMap<Character,Integer> h=new HashMap<Character,Integer>();
        h.put('I',1);
        h.put('V',5);
        h.put('X',10);
        h.put('L',50);
        h.put('C',100);
        h.put('D',500);
        h.put('M',1000);
        int result=0;
        for(int i=0;i<s.length();i++)
        {
            if((s.length()-i)==1)
            {
                result=result+h.get(s.charAt(i));
                break;
            }
                
            if(h.get(s.charAt(i))>=h.get(s.charAt(i+1)))
            {
                result=result+h.get(s.charAt(i));
            }
            else
            {
                result=result+h.get(s.charAt(i+1))-h.get(s.charAt(i));
                i++;
            }
        }
        return result;
    }

10.longest palindromic substring (5)

主要就是抓住,迴文字串,重要的是最中間那個字元,我們可以利用它來進行遍歷

注意substring的用法,right是子字串後面那一位。

class Solution {
    public String longestPalindrome(String s) {
        int left=0;
        int right=0;
        int j;
        int k;
        for(int i=0;i<s.length();i++)
        {
            j=i;
            k=j;
            while((k<s.length()-1)&&s.charAt(k)==s.charAt(k+1))
                k++;
            while(j>=0&&k<s.length()&&(s.charAt(j)==s.charAt(k)))
            {
                j--;
                k++;
            }
            if((right-left)<(k-j-1))
            {
                left=j+1;
                right=k-1;
            }
        }
        if(right==s.length())
            return s.substring(left);
        else
            return s.substring(left,right+1);
    }
}

11.   8. String to Integer (atoi)

class Solution {
    public int myAtoi(String str) {
        
        str = str.trim();   // kill add white spaces
        if (str == null || str.length() < 1) {
            return 0;
        }
        int i = 0;          // index of str
        char flag = '+';    // default positive
        if (str.charAt(0) == '-') {
            flag = '-';
            i++;
        } else if (str.charAt(0) == '+') {
            i++;
        }
        double res = 0;
        // abandon the non-digit char; calculate the result
        while (str.length() > i && str.charAt(i) >= '0' && str.charAt(i) <= '9') {
            res = res * 10 + str.charAt(i) - '0';
            i++;
        }
        if (flag == '-') res = -1 * res;
        if (res > Integer.MAX_VALUE) {
            return Integer.MAX_VALUE;
        } else if (res < Integer.MIN_VALUE) {
            return Integer.MIN_VALUE;
        }
        return (int) res;
    }
}

10. Regular Expression Matching 這題主要是根據p的情況來考慮

- 若p為空,若s也為空,返回true,反之返回false

- 若p的長度為1,若s長度也為1,且相同或是p為'.'則返回true,反之返回false

- 若p的第二個字元不為*,若此時s為空返回false,否則判斷首字元是否匹配,且從各自的第二個字元開始呼叫遞迴函式匹配

- 若p的第二個字元為*,若s不為空且字元匹配,呼叫遞迴函式匹配s和去掉前兩個字元的p,若匹配返回true,否則s去掉首字母

- 返回呼叫遞迴函式匹配s和去掉前兩個字元的p的結果

class Solution {
    public boolean isMatch(String s, String p) {
        if(p.length()==0)
            return s.isEmpty();
        if(p.length()==1)
            return s.length()==1&&(s.charAt(0)==p.charAt(0)||p.charAt(0)=='.');
        if(p.charAt(1)!='*'){
            if(s.length()==0) return false;
            return ((s.charAt(0)==p.charAt(0))||p.charAt(0)=='.')&&isMatch(s.substring(1),p.substring(1));
        }
        else{
            while((s.length()>0)&&(s.charAt(0)==p.charAt(0)||p.charAt(0)=='.')){
                if(isMatch(s,p.substring(2))) return true;
                s=s.substring(1);
            }
        }
        return isMatch(s,p.substring(2));
    }
}

當時在 while((s.length()>0)&&(s.charAt(0)==p.charAt(0)||p.charAt(0)=='.'))難了一會,因為沒有加(s.charAt(0)==p.charAt(0)||p.charAt(0)=='.')的括號,導致問題。

9. Palindrome Number

class Solution {
    public boolean isPalindrome(int x) {
        if(x<0||(x%10==0&&x!=0))
            return false;
        int num=0;
        while(x>num){
            num=num*10+x%10;
            x=x/10;
        }
        return x==num||num/10==x;
    }
}