建网站多少费用,wordpress go,网站 用户登陆 模板,丹徒网站建设2085、统计出现过一次的公共字符串
给你两个字符串数组 words1 和 words2 #xff0c;请你返回在两个字符串数组中 都恰好出现一次 的字符串的数目。
示例 1#xff1a;
输入#xff1a;words1 [leetcode,is,amazing,as请你返回在两个字符串数组中 都恰好出现一次 的字符串的数目。
示例 1
输入words1 [leetcode,is,amazing,as,is], words2 [amazing,leetcode,is]
输出2
解释
- leetcode 在两个数组中都恰好出现一次计入答案。
- amazing 在两个数组中都恰好出现一次计入答案。
- is 在两个数组中都出现过但在 words1 中出现了 2 次不计入答案。
- as 在 words1 中出现了一次但是在 words2 中没有出现过不计入答案。
所以有 2 个字符串在两个数组中都恰好出现了一次。示例 2
输入words1 [b,bb,bbb], words2 [a,aa,aaa]
输出0
解释没有字符串在两个数组中都恰好出现一次。示例 3
输入words1 [a,ab], words2 [a,a,a,ab]
输出1
解释唯一在两个数组中都出现一次的字符串是 ab 。提示
1 words1.length, words2.length 10001 words1[i].length, words2[j].length 30words1[i] 和 words2[j] 都只包含小写英文字母。 这道题目一眼一看就是哈希表但是总想得用一个哈希表跳不出思维用两个哈希表轻松解决
class Solution {
public:int countWords(vectorstring words1, vectorstring words2) {unordered_mapstring, int map1;unordered_mapstring, int map2;int count 0;for(const auto str1 : words1){map1[str1];}for(const auto str2 : words2){map2[str2];}for(auto it map1.begin();it ! map1.end();it){if(it-second 1 map2[it-first] 1){count;}}return count; }
};
这里补一个遍历哈希表的做法c17特性的做法比较方便吧不用迭代器了。 for (auto [str, cnt] : m1) 88、合并两个有序数组
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2另有两个整数 m 和 n 分别表示 nums1 和 nums2 中的元素数目。
请你 合并 nums2 到 nums1 中使合并后的数组同样按 非递减顺序 排列。
注意最终合并后数组不应由函数返回而是存储在数组 nums1 中。为了应对这种情况nums1 的初始长度为 m n其中前 m 个元素表示应合并的元素后 n 个元素为 0 应忽略。nums2 的长度为 n 。
示例 1
输入nums1 [1,2,3,0,0,0], m 3, nums2 [2,5,6], n 3
输出[1,2,2,3,5,6]
解释需要合并 [1,2,3] 和 [2,5,6] 。
合并结果是 [1,2,2,3,5,6] 其中斜体加粗标注的为 nums1 中的元素。示例 2
输入nums1 [1], m 1, nums2 [], n 0
输出[1]
解释需要合并 [1] 和 [] 。
合并结果是 [1] 。示例 3
输入nums1 [0], m 0, nums2 [1], n 1
输出[1]
解释需要合并的数组是 [] 和 [1] 。
合并结果是 [1] 。
注意因为 m 0 所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。提示
nums1.length m nnums2.length n0 m, n 2001 m n 200-109 nums1[i], nums2[j] 109
进阶你可以设计实现一个时间复杂度为 O(m n) 的算法解决此问题吗 一个时间复杂度低的做法时间复杂度Om n
class Solution {
public:void merge(vectorint nums1, int m, vectorint nums2, int n) {int i m - 1, j n - 1;int tail m n - 1;int cur 0;while(i 0 || j 0){if(i 0){cur nums2[j--];} else if(j 0){cur nums1[i--];} else if(nums1[i] nums2[j]){cur nums2[j--];} else{cur nums1[i--];}nums1[tail--] cur;}}
}; 27、移除元素 给你一个数组 nums 和一个值 val你需要 原地 移除所有数值等于 val 的元素并返回移除后数组的新长度。
不要使用额外的数组空间你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 说明:
为什么返回数值是整数但输出的答案是数组呢?
请注意输入数组是以「引用」方式传递的这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
// nums 是以“引用”方式传递的。也就是说不对实参作任何拷贝
int len removeElement(nums, val);// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i 0; i len; i) {print(nums[i]);
}
示例 1
输入nums [3,2,2,3], val 3
输出2, nums [2,2]
解释函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如函数返回的新长度为 2 而 nums [2,2,3,3] 或 nums [2,2,0,0]也会被视作正确答案。提示
0 nums.length 1000 nums[i] 500 val 100 很简单的想法快慢指针
class Solution {public:int removeElement(vectorint nums, int val) {int slowIndex 0;for(int fastIndex 0;fastIndex nums.size();fastIndex){if(val ! nums[fastIndex]){nums[slowIndex] nums[fastIndex];slowIndex;}}return slowIndex;}};