1. 程式人生 > >Leetcode 8 Two Pointers

Leetcode 8 Two Pointers

empty boolean cte ast inter git ise code 偏移

Two Pointers

1. 28. Implement strStr()

  用 i 記錄haystack偏移量,j 記錄 needle 的偏移量。

  

 1 class Solution {
 2     public int strStr(String haystack, String needle) {
 3         int lenH = haystack.length();
 4         int lenN = needle.length();
 5         if( lenN > lenH)
 6             return
-1; 7 if(lenN == 0) 8 return 0; 9 for(int i = 0; i <= lenH - lenN; i++){ 10 boolean flag = true; 11 for(int j = 0; j < lenN; j++){ 12 if( haystack.charAt(i + j) != needle.charAt(j)){ 13 flag = false;
14 break; 15 } 16 } 17 if (flag) 18 return i; 19 } 20 return -1; 21 } 22 }

2. 125. Valid Palindrome

  只需要建立兩個指針,head 和 tail, 分別從字符的開頭和結尾處開始遍歷整個字符串,如果遇到非字母數字的字符就跳過,繼續往下找,直到找到下一個字母數字或者結束遍歷,如果遇到大寫字母,就將其轉為小寫。等左右指針都找到字母數字時,比較這兩個字符,若相等,則繼續比較下面兩個分別找到的字母數字,若不相等,直接返回false.

    Character.isLetterOrDigit ( char ). 判斷是否為字符或數字

     Character.toLowercase ( char ) . 兩個函數

  

 1 class Solution {
 2     public boolean isPalindrome(String s) {
 3         if( s.isEmpty())
 4             return true;
 5         
 6         int head = 0, tail = s.length() -1;
 7         char cHead, cTail;
 8         while( head <= tail){
 9             cHead = s.charAt(head);
10             cTail = s.charAt(tail);
11             if(!Character.isLetterOrDigit(cHead))
12                 head++;
13             else if(!Character.isLetterOrDigit(cTail))
14                 tail--;
15             else{
16                 if(Character.toLowerCase(cHead) != Character.toLowerCase(cTail))
17                     return false;
18             head++;
19             tail--;
20             }  
21         }
22         return true;
23     }
24 }

3. 142. Linked List Cycle II Medium

  用快慢指針,假設有環時,head到環起點距離為A,環起點到相遇地點為B,慢指針走A+B,快指針移動距離總是慢指針兩倍,且比慢指針多走一圈設為N。A+B+N = 2A + 2B。

  A = N - B。head到環起點(新設一個指針指向head) = 一圈 減去 環起點到相遇地點 = 相遇點到環起點距離。

  

 1 public class Solution {
 2     public ListNode detectCycle(ListNode head) {
 3         ListNode fast = head, slow = head;
 4         while(fast!=null && fast.next!=null){
 5             slow = slow.next;
 6             fast = fast.next.next;
 7             if( fast == slow){
 8                 slow = head;
 9                 while( slow != fast){
10                     slow = slow.next;
11                     fast = fast.next;
12                 }
13                 return fast;
14             }
15         }
16         
17         return null;
18     }
19 }

Leetcode 8 Two Pointers