LC28. 实现 strStr()
//使用暴力匹配equals是否相同,将字符串分割成needle大小以后进行一个匹配操作。
class Solution {
public int strStr(String haystack, String needle) {
int m = haystack.length(),n = needle.length();
if(needle == null || n == 0)
return 0;
for(int i = 0;i <= m - n;i++){
if(needle.equals(haystack.substring(i,i+n))){
return i;
}
}
return -1;
}
}
LC剑指 Offer 65. 不用加减乘除做加法
//因为计算机底层都是使用补码进行加减乘除,所以补码对正数负数的加减乘除没有影响,可以直接采用位运算
//循环迭代运算
class Solution {
public int add(int a, int b) {
//计算进制位和非进制位
while(b != 0){
int c = (a & b) << 1;//进制位
a = a ^ b;//非进制位
b = c;//进制
}
return a;
}
}
//递归运算
class Solution {
public int add(int a, int b) {
//b作为进制位,如果为0,那么a ^ b = a;返回a即可
if(b == 0) return a;
return add(a ^ b,(a & b) << 1);
}
}
LC137. 只出现一次的数字 II
//所有这些只出现一次的数字的题可以用哈希表,但是如果数组当中数字只出现两次的话可以用异化操作,两个相同的数字异或操作之后为0,取第一个数为0,那么之后的异或值就只剩下一个num就是答案。
class Solution {
public int singleNumber(int[] nums) {
Map<Integer, Integer> freq = new HashMap<Integer, Integer>();
for (int num : nums) {
freq.put(num, freq.getOrDefault(num, 0) + 1);
}
int ans = 0;
for (Map.Entry<Integer, Integer> entry : freq.entrySet()) {
int num = entry.getKey(), occ = entry.getValue();
if (occ == 1) {
ans = num;
break;
}
}
return ans;
}
}