这是我参与8月更文挑战的第22天,活动详情查看:8月更文挑战
1967. 作为子字符串出现在单词中的字符串数目
思路分析
就算是第一题也没必要挨个判断是不是子字符串啊
int numOfStrings(vector<string>& patterns, string word) {
int ret =0;
for(int i = 0; i < patterns.size(); i++){
if(word.find(patterns[i]) != -1){
ret++;
}
}
return ret;
}
1968. 构造元素不等于两相邻元素平均值的数组
思路分析
最开始我的想法是根据遍历时的结果,当出现arr[i - 1] + arr[i + 1] = 2 * arr[i]的时候对两个相邻元素进行调换,然后就陷入了漫长的对不可能出现调换后结果平均的问题进行证明,然而这个思路是很难走通的。
当我们看到 返回满足题意的任一重排结果时,在答案非唯一的情况下,完全可以使用更普适的方法。当出现arr[i - 1] + arr[i + 1] = 2 * arr[i]的时候,必然是有arr[i - 1] - arr[i] = arr[i] - arr[i + 1] 的,也就是说,在数组元素本身互不相等的情况下,只要arr[i - 1] 和arr[i + 1]都大于arr[i], 或者arr[i - 1] 和arr[i + 1]都小于arr[i],就可以保证不会出现平均数的情况,因此我们可以将数组排序后,分为小和大两部分,保证小的部分中,所有元素严格小于任何大的部分中的元素,并将小和大交叉排列,这样就可以保证没有arr[i - 1] + arr[i + 1] = 2 * arr[i]的情况了。
sort(nums.begin(), nums.end());
int n = nums.size();
vector<int> res;
for (int i = 0; i < (n + 1) / 2; ++i){
res.push_back(nums[i]);
if (i + (n + 1) / 2 < n){
res.push_back(nums[i + (n + 1) / 2]);
}
}
return res;