思路:
1、用数组下标来表示是否出现过,初始为 0,出现则加 1,判断大于等于 2 的数字即为多次出现。
2、先将数组排序,依次遍历排序过的数组,若第 i 位与第 i+1 位相等,则说明是重复数字。
class Solution {
public:
vector<int> getSneakyNumbers(vector<int>& nums) {
int help[100]; //默认为零
vector<int> res; //动态数组
for(int i=0; i<nums.size(); i++){
help[nums[i]] = help[nums[i]] + 1;
if(help[nums[i]] >= 2){
res.push_back(nums[i]);
}
}
return res;
}
};
执行时间更短的解法:
class Solution {
public:
vector<int> getSneakyNumbers(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<int> more;
for(int i=0; i<nums.size()-1; i++){
if(nums[i] == nums[i+1]){
more.push_back(nums[i]);
}
}
return more;
}
};
注:
(1)定义数组:int a[10]
常量长度
(2)定义动态数组:vector<int> m;
默认是空。加入数据:m.push_back(数据)
(3)排序:sort(a.begin(), a.end());
,默认从小到大。
思路如下:
将数组写入 map 中
计算出目标数与遍历到数的差值,判断该数是否在 map 中
同时应该保证两个数是不同的,添加 && 判断
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int, int> m;
//把数组中的数写入map中
for(int i=0; i<nums.size(); i++){
m[nums[i]] = i;
}
for(int i=0; i<nums.size(); i++){
int x = target - nums[i];
if(m[x] && m[x]!=i ){
//x在数组中,并且另一个数不是它本身
return{i, m[x]};
}
}
return {};
}
};
注:
(1)map 字典
一种映射关系,可以是 map<int, int> m
, 也可以是 map<char, int> m
等
//把数组中的数写入map中
for(int i=0; i<nums.size(); i++){
m[nums[i]] = i;
}
解题思路:
class Solution {
public:
bool reportSpam(vector<string>& message, vector<string>& bannedWords) {
//定义一个map,表示bannedwords,默认是0
map<string, bool> m;
for(auto word1 : bannedWords){
m[word1] = true;
}
int count = 0;
for(auto word2 : message){
if(m[word2]) count++;
if(count >= 2) return true;
}
return false;
}
};
注:
(1)map 表示一种映射 map<string, bool> m;
(2)循环遍历所有项for(auto word1 : bannedWords)
for(auto word1 : bannedWords){
m[word1] = true;
}
遍历 bannedWords 的每个元素,并将每个单词作为键插入到一个映射