LeetCode—26(删除排序数组中的重复项)
方法一:这道题与移除有序链表中的重复项题(82与83)很类似,但是更要简单一些,因为毕竟数组的值可以通过下标直接访问,而链表不行。我们使用快慢指针来记录遍历的坐标,最开始时两个指针都指向第一个数字,如果两个指针指的数字相同,则快指针向前走一步,如果不同,则两个指针都向前走一步,然后将cur值赋值给不同值的坐标那。这样当快指针走完整个数组后,慢指针当前的坐标加1就是数组中不同数字的个数。
C++代码:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.empty()) return 0;
int pre = 0,cur = 0,n = nums.size();
while(cur < n){
if(nums[pre] == nums[cur]) ++cur;
else nums[++pre] = nums[cur++];
}
return pre + 1;
}
};
LeetCode—27 (移除元素)
方法:用一个变量用来计数,然后遍历原数组,如果当前的值和给定值不同,那就覆盖计数变量的位置,并将计数变量加1.
C++代码:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int res = 0;
for(int i =0;i < nums.size();++i){
if(nums[i] != val) nums[res++] = nums[i];
}
return res;
}
};
LeetCode—28(实现strStr())
方法:遍历即可,但是需要注意特殊情况。具体看代码。
class Solution {
public:
int strStr(string haystack, string needle) {
if (needle.empty()) return 0;
if (haystack.size() < needle.size()) return -1;
int m = haystack.size(),n = needle.size();
for (int i = 0; i <= m -n; ++i){//m-n的意思是不需要循环到末尾,到达n的长度停止即可。且一定得<=不然m=n时,将直接返回-1
int j = 0;
for (j = 0; j < n; ++j){
if(haystack[i+j] != needle[j]) break;
}
if (j == n) return i;
}
return -1;
}
};
LeetCode—29(两数相乘)
C++代码:
class Solution {
public:
int divide(int dividend, int divisor) {
if(divisor == 0 || dividend == INT_MIN && divisor == -1) return INT_MAX;
long long m = abs((long long)dividend),n = abs((long long)divisor),res = 0;
int sign = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1;//^符号为异或符号,相同为假,不同为真。没有同或符号
if (n == 1) return sign == 1 ? m : -m;
while(m >= n){
long long t = n,p = 1;
while(m >= (t << 1)){
t <<= 1;
p <<= 1;
}
res += p;
m -= t;
}
return sign == 1? res : -res;
}
};
LeetCode—30(串联所有单词的子串)
C++代码:
class Solution {
public:
vector<int> findSubstring(string s, vector<string>& words) {
vector<int> res;
if(s.empty() || words.empty()) return res;//判断为空则,返回空。
int n = words.size(),m = words[0].size();
unordered_map<string,int> m1;
for (auto &a : words) ++m1[a];
for (int i=0; i <= (int)s.size() - n*m; ++i){
unordered_map<string,int> m2;
int j = 0;
for (j = 0;j < n;++j){
string t = s.substr(i+j*m,m);//依次截取m个2m个字符进行判断
if (m1.find(t) == m1.end()) break;
++m2[t];//放入哈希表2
if (m2[t] > m1[t]) break;//?不太清楚 好像是不可以重复使用
}
if (j == n) res.push_back(i);
}
return res;
}
};