验证回文串
定义一个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
今天到这里了~~~