680. 验证回文字符串 Ⅱ
class Solution {
public boolean validPalindrome(String s) {
int left = 0;
int right = s.length()-1;
while(left<right){
if(s.charAt(left)!=s.charAt(right)){
return isValid(s,left+1,right) || isValid(s,left,right-1);
}
left++;
right--;
}
return true;
}
public boolean isValid(String s, int i, int j){
while(i < j){
if(s.charAt(i) != s.charAt(j)){
return false;
}
i++;
j--;
}
return true;
}
}
面试题 02.07. 链表相交
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA==null || headB==null) return null;
ListNode h1 = headA, h2 = headB;
while(h1 != h2){
h1 = h1==null ? headB:h1.next;
h2 = h2==null ? headA:h2.next;
}
return h1;
}
}
面试题 05.07. 配对交换
class Solution {
public int exchangeBits(int num) {
//奇数
int odd = num & 0x55555555;
//偶数
int even = num & 0xaaaaaaaa;
odd = odd << 1;
even = even >>> 1;
return odd | even;
}
}
// 0x55555555 = 0b0101_0101_0101_0101_0101_0101_0101_0101
// 0xaaaaaaaa = 0b1010_1010_1010_1010_1010_1010_1010_1010
//把所有奇数位的1拿出来,左移一位变成偶数位的1,5的二进制表示位0101,1在奇数位,与操作提出所有奇数位的1
//把所有偶数位的1拿出来,右移一位变成奇数位的1,a的二进制表示位1010,1在偶数位,与操作提出所有偶数位的1
//比如3,偶数部分就是0010,奇数部分是0001,奇偶位置发生交换,那么偶数部分需要右移一位,奇数部分需要左移一位
//再把奇数偶数部分相加,使用加号,或者|均可
你知道的越多,你不知道的越多。