D9 202. 快乐数 1. 两数之和
202 快乐数 ( 力扣:[https://leetcode.cn/problems/happy-number/] )
条件: 给定数字n每位上的数取出来求平方、平方加和为1则为快乐数,否则对当前和逐位平方再求和直到得到1;
Tips:
- 分为两步,一步使用求余和除10进位,一步判断得到1还是陷入循环,这里比较重要的是理解题目的暗示,即存在陷入循环的情况,陷入循环也是唯一需要return false的情况,否则可以一直试;
代码来自ai生成:
点击查看代码
class Solution {
public:
int getSum( int n ){
int sum = 0;
//n默认大于1,则这里会在
while( n ){
//取当前个位(最低位)上的数字求平方
sum += (n%10) * (n%10);
//待处理数字向高位进一位
n /= 10;
}
return sum;
}
bool isHappy( int n ) {
//注意,sum的set的创建一定要在while外,更新在while内
//sum因为是每次while都会被更新所以创建在循环内或外都可以
unordered_set<int> sumRecord;
while(1){
//运行计算,得到当前n的sum
int sum = getSum(n);
//如果结果为1直接返回
if( sum == 1 ){
return true;
}else{
//如果不能返回1,先判断这个sum是否出现过
//出现直接判定为陷入循环,false
if( sumRecord.find(sum) != sumRecord.end() )
{ return false; }
//否则存储当前sum值,跳出判断
sumRecord.insert(sum);
}
//无返回值则更新一下n再进行循环
n = sum;
}
}
};
1 两数之和 ( 力扣:[https://leetcode.cn/problems/two-sum/] )
条件: 在数组内找到不重复的两个值,使得两值之和为target,返回对应两数的数组下标;
Tips:
- 出现不重复且要快速查找考虑unordered的集合,而使用数组的值匹配后要返回对应下标,而下标和值不像字母异位词可以通过一个求另一个,则使用map可以同时匹配下标和值;
- 一二维数组和unordered_set/map的区别,数组的下标是有序且连续的整数、内存连续,unordered_set无序且直接查找值而非下标,map的key不重复的任意(可为支持比较和其他类型如string)和value;
代码来自ai生成:
点击查看代码
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
//定义map存储数组的下标和对应的值
unordered_map<int,int>numsRecord;
//遍历数组
for( int i = 0; i < nums.size(); i++ ){
//auto根据表达式初始值确定类型
//计算当前nums[i]要加到target需要的值是否在map里
//这里要求数组值不能重复使用所以为key,下标为value
auto need = numsRecord.find( target - nums[i]);
//如果找到对应value存在,则返回两个下标
if( need != numsRecord.end() ){
//注意返回之前未定义的新数据组无需定义为 int ans[2] = {}
//取key用need->first,取value使用need->second
return { need->second, i };
}else{
//否则将当前数组下标及值存入map
numsRecord.insert(pair<int,int>( nums[i], i ));
}
}
//为保证通过编译加入空集,但由于题目条件实际不会存在无结果的情况
return {};
}
};
浙公网安备 33010602011771号