D9 202. 快乐数 1. 两数之和

202 快乐数 ( 力扣:[https://leetcode.cn/problems/happy-number/] )

条件: 给定数字n每位上的数取出来求平方、平方加和为1则为快乐数,否则对当前和逐位平方再求和直到得到1;
Tips:

  1. 分为两步,一步使用求余和除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:

  1. 出现不重复且要快速查找考虑unordered的集合,而使用数组的值匹配后要返回对应下标,而下标和值不像字母异位词可以通过一个求另一个,则使用map可以同时匹配下标和值;
  2. 一二维数组和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 {};
    }
};

posted @ 2026-04-06 23:52  SCONLY  阅读(3)  评论(0)    收藏  举报