[七日打卡]之第十一卡:验证回文串、只出现一次的数字、相交链表

352 阅读1分钟

验证回文串

定义一个StringBuffer,如果当前字符是字母或者数字,将当前字符添加到StringBuffer中,最后通过reverse()方法反转,判断反转之前与反转之后的字符串是否相同。

这道题也可以用双指针方法,也是用到Character.isLetterOrDigit(c)方法,比较首尾字符串。

class Solution {
    public boolean isPalindrome(String s) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (Character.isLetterOrDigit(c)) {
                sb.append(Character.toLowerCase(c));
            }
        }
        return sb.toString().equals(sb.reverse().toString());
    }
}

双指针方法:

class Solution {
    public boolean isPalindrome(String s) {
        int left = 0;
        int right = s.length() - 1;

        while (left < right) {

            while (left < right && !Character.isLetterOrDigit(s.charAt(left))) {
                left++;
            }
            while (left < right && !Character.isLetterOrDigit(s.charAt(right))) {
                right--;
            }
            if (left < right) {
                if (Character.toLowerCase(s.charAt(left)) != Character.toLowerCase(s.charAt(right))) {
                    return false;
                }
                left++;
                right--;
            }
        }
        return true;
    }
}

只出现一次的数字

核心:使用异或。

异或中的规律:

a^a=0

a^0=a

同时异或也可以使用结合律与交换律。

class Solution {
    public int singleNumber(int[] nums) {
        int m = nums[0];
        for (int i = 1; i < nums.length; i++) {
            m ^= nums[i];
        }
        return m;
    }
}

相交链表

思路:

方法一:可以使用哈希表。

方法二:双指针方法,A链表遍历完之后指向B,同理,B链表遍历完之后指向A。这样两个指针的总路程相同。

如果A、B链表长度相同,末尾有相同元素,那么两个指针可以同时到达相同元素。

如果A、B链表长度不同,末尾有相同元素,那么,A链表的指针需要走到B链表之后,B链表的指针需要走到A链表之后,在两个链表相同元素出相逢。

哈希表代码:

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {

        HashSet<ListNode> set = new HashSet<ListNode>();

        while (headA != null || headB != null) {
            if (headA != null && !set.add(headA)) {
                return headA;
            } else if (headA != null) {
                headA = headA.next;
            }

            if (headB != null && !set.add(headB)) {
                return headB;
            } else if (headB != null) {
                headB = headB.next;
            }
        }
        return null;
    }
}

双指针方法:

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {

        ListNode ha = headA;
        ListNode hb = headB;

        while (ha != hb) {
            ha = ha == null ? headB : ha.next;
            hb = hb == null ? headA : hb.next;
        }
        return ha;
    }
}

OK

今天到这里了~~~