代码随想录算法训练营第06天 | 242.有效的字母异位词 、349. 两个数组的交集 、202. 快乐数 、1. 两数之和

题目

初见思路

42.有效的字母异位词

比较简单的一道题,注意,使用record[s[i] - 'a'] 这里减‘a’是为了让index从0开始。

1002.查找常用字符

一开始使用的unoreder_set,无法识别多个相同字母交集,如["bella","label","roller"]结果应该是["l","l","e"]我的结果确是["l","e"]

349. 两个数组的交集

使用两个unordered_set,一个储存结果,一个存放nums1。用set.find来找nums1和nums2相同的数,insert进如储存结果的set(set不会储存重复的key)。

202. 快乐数

用取模的方式来计算sum,但不知道在没有1的情况下这么退出循环。

1. 两数之和

想到了用unordered_map,key储存数组的值,value储存数组的index。在一个for loop中查找是否有减掉target后相同的值,没有就插入map,有就返回。但有些测试过不了。

更新思路

42.有效的字母异位词

使用record[s[i] - 'a'] 这里减‘a’是为了让index从0开始。a-z 编码是连续的。

1002.查找常用字符

看了代码随想录后还是想尝试一下使用set 或者 map。于是使用unordered_map,这样可以统计重复common letter出现的次数。首先用第一个string来初始化一下map,然后在一个for loop中(长度为words的长度,从i=1开始)创建一个tempMap,并用words[i]来进行初始化。然后在loop中比较commonMap(计算的前一个string)和tempMap(计算的当前string)中每个字母的出现次数。没有出现的话,这个字母在commonMap(key都是第一个string的字母)中的count就是0,出现了也要取最小的count(防止这种情况的结果出现两个o, ["cool","lock","cook"])。然后转化为vector:

vector<string> commonChars(vector<string>& words) {

	unordered_map<char, int> commonMap;

	// init map with first string's letter

	for(char c : words[0]) {

		commonMap[c]++;

	}

	// For each remaining word

	for(int i = 1; i < words.size(); ++i){

		unordered_map<char, int> tempMap;

		for(char c : words[i]) {

			tempMap[c]++;

		}

		// Update commonMap to hold the minimum count of each character

		for(auto& [ch, count] : commonMap) {

			if(tempMap.count(ch)) {

				count = min(count, tempMap[ch]);

			} else {

				count = 0;

			}

		}

	}

	vector<string> res;

	for (auto& pair : commonMap) {

		for(int i = 0; i < pair.second; i++) {

			res.push_back(string(1, pair.first));

		}

	}

	return res;

}

349. 两个数组的交集

c++中可以用iterator来初始化各种容器。如:unordered_set<int> set1(nums1.begin(), nums1.end());, vector<int>(res.begin(), res.end())

202. 快乐数

	if(sums.find(sum) != sums.end()){
		return false;
	} else {
		sums.insert(sum);
	}

用一个set来保存所有sum,当遇到重复的时证明已经进入一个cycle了,不会出现1了。在一个while loop中,有1就return true,有重复就false。

       while(true){
            int sum = getSum(n);
            if(sum== 1) return true;

            if(sums.find(sum) != sums.end()){
                return false;
            } else {
                sums.insert(sum);
            }
            n = sum;
        }

1. 两数之和

有些测试过不了的原因是用成了nums[i]-target, 应该用target去减,因为那两个数肯定比target小或者相等。

今日总结

学习时长

4h

收获

开始熟悉哈希了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值