思路:
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,默认是0map<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 的每个元素,并将每个单词作为键插入到一个映射