小工具      在线工具  汉语词典  css  js  c++  java

ch3_4 快乐数字 ch3_5 数组中的两数之和

# C++,数组的两数之和 额外说明

收录于:196天前

1. 快乐数字

快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。

如果 n 是快乐数就返回 True ;不是,则返回 False 。

示例:

输入:19
输出:true
解释:

1 2 + 9 2 = 82 1^2 + 9^2 = 82 12+92=82

8 2 + 2 2 = 68 8^2 + 2^2 = 68 82+22=68

6 2 + 8 2 = 100 6^2 + 8^2 = 100 62+82=100

1 2 + 0 2 + 0 2 = 1 1^2 + 0^2 + 0^2 = 1 12+02+02=1

在这里插入图片描述

1.1 解题步骤

  1. 对当前的数值,写出各个位上的数字的平方和函数;
    1. 通过求模运算, 先求出当前数最低位上 数字的平方和;
    2. 从地位到高位, 将当前数更新为 整除 10 后的数;

  2. 判断是否是快乐数:
    新建一个 关联式容器, unorder_set:
    条件始终为真的循环, (循环内部 跳出)
    获取最后一个平方和;
    判断最后的平方和是否为1; 若是, 返回true;

    判断 该平方和 是否出现在 容器中,
    若果出现过,说明陷入了循环, 返回 false;
    否则, 将该平方和 插入到 关联式容器中;

    更新 当前数 = 平方和

1.2 code

#include "unordered_set"

using namespace std;


class Solution{
    
public:
    int getSum(int n){
    
        int sum = 0;
        while(n){
    
            sum += (n % 10) * (n % 10);
            n = n / 10;
        }
        return  sum;
    }

    bool isHappy(int& n){
    

        unordered_set<int>  set;
        while(1){
    

            int cur_sum = getSum(n);
            if (cur_sum == 1) return  true;
            // 当前值 不为空, 说明在容器中查找到了; 说明sum 进入循环了, 返回 false ,不是快来数字;
            if( set.find( cur_sum ) != set.end()){
    
                return false;}else {
    
                set.insert(cur_sum);
            }

            n = cur_sum;
        }
    }

};

2. 数组中的两数之和

在这里插入图片描述

考虑到, 数组和集合set 自身的局限性:

  1. 数组的大小受限, 而且如果元素很少,而哈希值太大会造成内存空间的浪费。

  2. set是一个集合,集合中只能存放一个 key (关键字), 而不能存放关键字所对应的值; 本题要判读 关键字(数组中的元素) 是否存在, 还要保存 关键字所对应的值(数组元素所对应的下标),所以 最小组成成分,是由两个元素构成, 故set 不用,使用map;

2.1 解题步骤

解题前, 先了解一下知识点;

1.关联式容器中的哈希容器 unordered_map
2. 使用了 容器中的 find(), end(), insert() 这三种内置方法;
3. 使用了 auto 自动变量类型推导
4. 使用 pair 类模板;

#include "vector"
#include "unordered_map"
#include "iostream"
#include "utility"
using namespace std;


class  Solution{
    
public:
    vector<int> twoSum(vector<int>& nums, int target){
    
        unordered_map<int, int> map;
        for(int i = 0 ; i < nums.size(); i++){
    
            auto it = map.find(target - nums[i]);
            if (it != map.end()){
     return  {
    it->second, i};}  // 注意这里, 返回的是两个下标, 第一个 it->second 返回的是map中的 单个项的下标, 第二个i 返回的当前数组的下标, 代表了找到与map中匹配的数字,
            map.insert(pair<int, int>(nums[i], i)) ;  // 这里使用了 内置的 pair类模板; 并且初始化其中的数值, 然后将其插入到 map 中;
        }


    }


};

  1. 函数返回的是一个序列式中的向量容器, 函数 传入的参数是(向量容器的 引用, 整型数字)

  2. 声明一个unordered_map 的关联式容器,里面的每一项都是一组键值对的存在形式<key, value> , 用来存放 数组中的数值, 和该数值所对应的数组下标;

  3. 遍历数组,
    遍历过程中, 使用关联式容器的查找方法, 在容器中查找当前的数组值,
    将 查找到的结果 赋值 一个 自动变量类型的 item
    如果该 item != 容器的结尾, 表明在容器中查找到所需要的值:
    则返回该值所对应的 项

    否则,没有查到:
    则将 数组的数值,和下标 使用 pair 构成一组键值对, 插入到 map容器中;

. . .

相关推荐

额外说明

Springboot-集成ant实现文件(文件夹)压缩下载

前言 文件压缩和下载在后端开发中属于比较常见的功能,一些涉及到证书、文件等资源信息,都会有这方面的处理。 本篇博客重点讲述单文件打包压缩、文件夹打包压缩和压缩文件下载功能的实现。 测试前的准备 开发环境 本次使用到的主要框架、版本如下所示: Spring

额外说明

如果接入设备屏幕宽度小于1024,则跳转到移动端

<script> function jumpIfMobile() { //判断是移动设备 且 宽度小于1024 后跳转到m站 if ( window.innerWidth <= 1024 && navigator.

额外说明

如何使用@JsonSerialize(using = ToStringSerializer.class)和@JsonSerialize注解

fastjson的ToStringSerializer注解: java中long数据能表示的范围比js中number大,在跟前端交互时,这样也就意味着部分数值在js中存不下(变成不准确的值)。 解决办法可以这样: 使用fastjson的ToStringS

额外说明

leetcode113(路径总和II:DFS回溯)

给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。 说明: 叶子节点是指没有子节点的节点。 示例: 输入:[5,4,8,11,null,13,4,7,2,null,null,5,1],22 输出:[ [5,4,11,2]

额外说明

高等数学之微分

    高阶无穷小可忽略 A▲x为 线性主部  主要部分那过来记作dy      换掉▲x        导数可看作两个微分的商  最终公式    复合函数求导  实例    

额外说明

泛函分析——内积空间定义的概念

希尔伯特空间: Let ( X , ⟨ ⋅ , ⋅ ⟩ ) (X,\langle\cdot, \cdot\rangle) (X,⟨⋅,⋅⟩) be an inner product space. If X X X is complete with res

额外说明

基于 FineReport 快速设计联动报表

一、基于 FineReport 快速设计联动报表 FineReport 一款用于报表制作,分析和展示的工具,可以轻松的构建出灵活的数据分析和报表系统。 下面基于 FineReport 自带的数据表 销量 表快速设计一页可视化联动报表,数据格式如下: 报表

额外说明

[Ext JS6] Grid 某些行不允许删除和选择的实现

文章目录 效果比较 Grid的代码 效果实现 效果比较 实现前效果: 实现后效果: 是否可以删除和选择依据editable列的值决定, 为"N"时不允许删除。 Grid的代码 列的复选框的实现是设置Grid的selType的属性值为’checkboxmo

额外说明

《天天数学》连载12:一月十二日

格言作者:托马斯·曼(1875年—1955年),德国小说家和散文家,出生于德国北部卢卑克城一家望族。1924年发表长篇小说《魔山》。1929年度获得诺贝尔文学奖。代表作是被誉为德国资产阶级的“一部灵魂史”的长篇小说《布登勃洛克一家》(1901),被看作德

额外说明

WordCamp Columbus 2012(回顾,思想和图片)

This past weekend I, Syed, had a pleasure of attending and speaking at WordCamp Columbus. This was my second year at WordCamp C

ads via 小工具