zoukankan      html  css  js  c++  java
  • Leetcode 8 Two Pointers

    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 }
  • 相关阅读:
    Bean
    DI
    require import export
    JSON转js
    vue路由相关
    JS引号区别
    Go语言系列之标准库strconv
    Go语言系列之标准库flag
    Go语言系列之并发编程
    Go语言系列之自定义实现日志库
  • 原文地址:https://www.cnblogs.com/Afei-1123/p/10776928.html
Copyright © 2011-2022 走看看