【算法题】统计各位数字之和为偶数的整数个数、替换空格、旋转数组的最小数字

news2024/11/13 3:30:17

算法题之数字处理

  • 一、统计各位数字之和为偶数的整数个数
    • 1.1、题目
    • 1.2、理解题目
    • 1.3、解题思路(暴力枚举)
    • 1.4、解题思路2(数学公式)
    • 1.5、小结
  • 二、替换空格
    • 2.1、题目
    • 2.2、解题:遍历原地修改
  • 三、旋转数组的最小数字
    • 3.1、题目
    • 3.2、思路
    • 3.3、代码实现
    • 3.4、小结
  • 总结

一、统计各位数字之和为偶数的整数个数

1.1、题目

给你一个正整数 num ,请你统计并返回 小于或等于 num 且各位数字之和为 偶数 的正整数的数目。

正整数的 各位数字之和 是其所有位上的对应数字相加的结果。

示例 1:

输入:num = 4
输出:2
解释:
只有 2 和 4 满足小于等于 4 且各位数字之和为偶数。

示例 2:

输入:num = 30
输出:14
解释:
只有 14 个整数满足小于等于 30 且各位数字之和为偶数,分别是:
2、4、6、8、11、13、15、17、19、20、22、24、26 和 28 。

来源:力扣(LeetCode)

1.2、理解题目

也就是给一个int型的整数num,统计大于0小于num范围内的满足要求的数字个数,这个数字的要求是其各位数字之和为偶数(比如10的个位数之和为1+0=1,不满足要求;13的个位数之和为1+3=4,满足要求)。

1.3、解题思路(暴力枚举)

首先想到的解题思路:

将num逐步减一(满足小于或等于 num要求),用一个循环对当前值的计算值取模和求余(,每次的取模得到的数(就是各位数)相加,直到求余得到的数为0时退出循环,然后判断取模得到的数(就是各位数)相加是否为偶数。

代码:

class Solution {
public:
    int countEven(int num) {
        int count=0;//统计数量
        while(num>1)// 判断
        {
            int pre=num;// 保存要计算的数值
            int cur=0; // 记录
            while(pre)
            {
                cur+=pre%10;//取模并相加
                pre/=10;//取余
            }
            if(cur%2==0)//偶数
                count++;//统计
            num--;//递减
        }
        return count;
    }
};

测试结果:

执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:5.8 MB, 在所有 C++ 提交中击败了40.59%的用户
通过测试用例:71 / 71

时间复杂度: O(n log n) 。

空间复杂度: O(1)。

1.4、解题思路2(数学公式)

首先,位于区间[0, 10)的奇数和偶数的个数都是5个。将 num表示为 10y+x的形式,其中 x大于等于0小于10且y大于等于0 ,那么位于区间 [0,num]的整数可以分为两个部分:区间[10y+0,10y+x]和区间[0,10y+0]

总结就是一个公式:将 num表示为10y+x,y=num/10,x=num%10;然后计算y的各个数之和是否为偶数,如果是偶数则结果为 y5+x/2+1 ,如果是奇数则结果为 y*5+(x+1)/2 。

上述区间中多计入了整数0,因此结果应该是位于上述区间且各位数字之和为偶数的个数减1。

class Solution {
public:
    int countEven(int num) {
        // num=10*y+x
        int y=num/10;
        int x=num%10;
        int res=y*5;
        int ysum=0;
        while(y)
        {
            ysum+=y%10;
            y=y/10;
        }
        if(ysum%2==0)
            res+=x/2+1;
        else
            res+=(x+1)/2;
        return res-1;
    }
};

测试结果:

执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:5.8 MB, 在所有 C++ 提交中击败了30.07%的用户

时间复杂度: O(log n)。

空间复杂度:O(1)。

1.5、小结

暴力枚举各位数之和的核心:

while(...){
    sum+=num%10;
    num/=10;
}
  1. 数学公式: num表示为10y+x , y=num/10,x=num%10 。result=y5+(y的各位数之和是偶数吗)?(x/2+1) : (x(+1)/2) -1 。

二、替换空格

2.1、题目

实现一个函数,把字符串s中的每个空格替换成"%20"。

示例 1:

输入:s = “We are happy.”
输出:“We%20are%20happy.”
来源:力扣(LeetCode)

2.2、解题:遍历原地修改

在 C++ 语言中, string 被设计成「可变」的类型,因此可以在不新建字符串的情况下实现原地修改。

class Solution {
public:
    string replaceSpace(string s) {
        int len=s.length();
        string ret="";
        int i=0;
        while(i<len)
        {
            if(s[i]==' ')
                ret+="%20";
            else
                ret+=s[i];
            i++;
        }
        return ret;
    }
};

时间复杂度 O(N) 。

空间复杂度 O(1) 。

三、旋转数组的最小数字

3.1、题目

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。

给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为 1。

注意,数组 [a[0], a[1], a[2], …, a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], …, a[n-2]] 。

示例 1:

输入:numbers = [3,4,5,1,2]
输出:1

示例 2:

输入:numbers = [2,2,2,0,1]
输出:0

来源:力扣(LeetCode)

3.2、思路

排序数组的查找问题首先考虑使用二分法解决,其可将遍历法的线性级别时间复杂度降低至对数级别。

在这里插入图片描述

二分法算法流程:

  1. 初始化:声明两个指针low、hight分别指向numbers的首元素和尾元素。
  2. 使用一个循环来二分,每次循环都计算中心位置inv=low+(hight-low)/2。
  3. 调整low和hight的位置:如果中心点inv位置的元素小于最高点hight位置的元素,则hight=inv;如果中心点inv位置的元素大于最高点hight位置的元素,则low=inv+1;否则hight=hight+1。
  4. 返回值: 当low==hight时跳出二分循环,并返回 旋转点的值 nums[low] 即可。

3.3、代码实现

class Solution {
public:
    int minArray(vector<int>& numbers) {
        int hight=numbers.size()-1;
        int low=0;
        while(low<hight)
        {
            int inv=low+(hight-low)/2;
            if(numbers[inv]>numbers[hight])
            {
                low=inv+1;
            }
            else if(numbers[inv]<numbers[hight])
            {
                hight=inv;
            }
            else
                hight-=1;
        }
        return numbers[low];

    }
};

时间复杂度 O ( l o g 2 N ) O(log_2 N) O(log2N) : 在特例情况下(例如 [1, 1, 1, 1]),会退化到 O(N)。

空间复杂度 O(1) : 变量使用常数大小的额外空间。

当然,还有暴力枚举法,这种方法不建议。

class Solution {
public:
    int minArray(vector<int>& numbers) {
        int n=numbers.size();
        if(n==0)
            return 0;
            
        int res=numbers[0];
        for(int i=1;i<n;i++)
        {
            if(numbers[i]<numbers[i-1])
                return numbers[i];
        }
        return res;
    }
};

3.4、小结

二分法可以解决排序数组的查找问题,降低时间复杂度。

二分法步骤:

  1. 初始化:定义两个指针low、hight,分别指向开头和末尾。
  2. 循环二分:每次循环都计算中间点(hight-low)/2,根据题意比较中心点和边沿的关系进行low和hight的变化。
  3. 当low==hight时跳出二分循环,并返回low对应的结果即可。

总结

一定要做好总结,特别是当没有解出题来,没有思路的时候,一定要通过结束阶段的总结来反思犯了什么错误。解出来了也一定要总结题目的特点,题目中哪些要素是解出该题的关键。不做总结的话,花掉的时间所得到的收获通常只有 50% 左右。

在题目完成后,要特别注意总结此题最后是归纳到哪种类型中,它在这种类型中的独特之处是什么。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/684430.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何判断TongWeb是否支持某种数据库?

起因&#xff1a; 数据库连接池本是一项成熟的技术&#xff0c;但随着数据库厂家、种类的增加&#xff0c;常常被问到TongWeb是否支持XX数据库&#xff1f; 说明&#xff1a; 数据库连接池的基本思路是&#xff0c;平时建立适量的数据库的连接&#xff0c;放在一个集合中&…

举例说明,JS中的【return true】和【return false】的【使用场景】

1.return true和return false都是写在函数里面 2.如果一个函数需要有返回值&#xff0c;则函数中需要写return相关 3.return true和return false是之后调用这个函数判断用&#xff1a; 如果一个函数需要返回值&#xff0c;则需要在函数中添加return 如果函数中添加的是 比如 …

2-css-4

一 标准流 标准流也叫文档流&#xff0c;指的是标签在页面中默认的排布规则&#xff0c;例如&#xff1a;块元素独占一行&#xff0c;行内元素可以一行显示多个。 二 浮动 1 认识 作用&#xff1a;让块元素水平排列。 属性名&#xff1a;float 属性值 left&#xff1a;左…

跳槽过去,刚工作三天就被裁是一种怎样的体验

前言 还有谁&#xff1f;刚上三天班就被公司公司的工作不适合我&#xff0c;叫我先提升一下。 后面我也向公司那边讨要了一个说法&#xff0c;我只能说他们那边的说辞让我有些不服气。 现在之所以把这件事在csdn上记录一下&#xff0c;一是记录一下自己的成长轨迹&#xff0…

2023计算机组成原理【5-7】

第五章 中央处理器 1&#xff0e;指令周期的概念&#xff0c;与时钟周期、机器周期的区别。 指令周期是执行一条指令所需的时间&#xff0c;包括多个子阶段的时间总和时钟周期是计算机系统中的基本时间单位&#xff0c;由时钟信号控制&#xff0c;用于同步处理器和其他组件的操…

Collectors.toMap使用详解

这里写目录标题 一、使用规则二、源码及方法三、代码示例1.将list转成以id为key的map&#xff0c;value是id对应的Dept对象2.假如id存在重复值&#xff0c;则会报错Duplicate key xxx, 解决方案是3.想获得一个id和name对应的Map<Integer, String>4.把Dept集合按照group分…

5年软件测试工作经验,高不成低不就,真的只能转行了吗?

迷茫感&#xff0c;从哪里来&#xff1f; 不知不觉在软件测试行业&#xff0c;野蛮生长了5年之久。这一路上拥有了非常多的感受。有迷茫&#xff0c;有踩过坑&#xff0c;有付出有收获&#xff0c; 有坚持&#xff01; 我一直都在软件测试行业奋战&#xff0c; 毕业时一起入职…

制作自定义pfx证书(数字签名)

目录 生成server.key 生成server.crt 生成server.pfx 结果 exe文件签名 生成server.key openssl genrsa -des3 -out server.key 2048 Generating RSA private key, 2048 bit long modulus (2 p

单独生成 main.exe, pyinstaller × pyecharts 打包报错找不到文件 map_filename.json 一次搞定!

报错&#xff1a; FileNotFoundError: [Errno 2] No such file or directory: ‘C:\Users\xxx\AppData\Local\Temp_MEI3455\pyecharts\datasets\map_filename.json’ pyecharts 打包成 exe 的时候找不到 map_filename.json 文件。先找到这个文件,一般在本机 Python 安装目录下…

一文掌握linux系统管理命令

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

SuperMap GIS基础产品移动GIS FAQ集锦(3)

SuperMap GIS基础产品移动GIS FAQ集锦&#xff08;3&#xff09; 【iMobile】网络分析中设置权值字段&#xff0c;如何添加多个权值字段&#xff1f; 【解决办法】通过权值字段集合类&#xff08;WeightFieldInfos&#xff09;设置&#xff0c;该类是权值字段信息对象&#x…

回波3DFFT处理(测距、测速、测角)

回波3DFFT处理&#xff08;测距、测速、测角&#xff09; 1、测距、测速2、测角3、3DFFT处理4、MATLAB程序 本文主要针对TI 毫米波雷达的测距、测速、测角的基本方法——3DFFT处理进行简单介绍&#xff0c;并提供MATLAB处理程序&#xff0c;分析3DFFT处理结果。 1、测距、测速…

高等数学下拾遗+与matlab结合

如何学好高等数学 高等数学是数学的一门重要分支&#xff0c;包括微积分、线性代数、常微分方程等内容&#xff0c;它是许多理工科专业的基础课程。以下是一些学好高等数学的建议&#xff1a; 扎实的基础知识&#xff1a;高等数学的内容很多&#xff0c;包括初等数学的一些基…

Postgresql源码(107)analyze行采样流程分析(pg_class中reltuples行数评估是哪里来的准确吗)

总结 pg_class中reltuples行数评估是哪里来的&#xff1f; 行数评估发生在acquire_sample_rows采样函数中&#xff0c;算作采样的副产品之一。 总行数评估totalrows即&#xff1a;扫到页面中live元组的数量 / 扫到多少页面 * 总页面&#xff0c;向上取整。 pg_class中reltu…

十九、socket套接字编程——udp

文章目录 一、socket套接字编程接口&#xff08;一&#xff09;socket头文件&#xff08;二&#xff09;socket 常见API&#xff08;套接字编程接口&#xff09;1. 创建 socket 文件描述符 (TCP/UDP, 客户端 服务器 )2.绑定网络信息 (TCP/UDP, 服务器 )3.开始监听 socket (TCP…

【安装教程】KingFunsion3.6-Windows版本的安装教程

哈喽&#xff01;大家好&#xff0c;我是雷工&#xff01; 由于项目需要今天学习认识KingFunsion3.6及记录Windows版本的安装教程。 一、KingFunsion介绍 1、KingFunsion是什么&#xff1f; KingFunsion是一款面向工程师的管控一体化全组态平台&#xff0c;是一套面向制造企…

Flutter进阶-Future、FutureBuilder、StreamBuilder详解

一、时间循环 Event Loop机制 程序之所以卡说白了就是没有时间更新UI界面刷新屏幕导致 常见的卡顿主要是两种&#xff1a; 1.很大的计算量CPU忙不过来 2.等待&#xff0c;等服务器的响应、等用户的输入、等文件的读取...等等 在多线程的机制里每当遇到需要等的东西就开启一…

管理类联考——逻辑——知识篇——分析推理——二、匹配——haimian

匹配 题型识别 题干一般提供3-5个对象和2~3个维度的信息&#xff0c;并描述某对象及信息间的条件关系&#xff0c;要求将信息进行匹配。要从一个一个条件出发&#xff0c;通过逻辑推理&#xff0c;得出正确答案。 思维导图 解题技巧 注意选项的模式&#xff0c;如果已经将关…

Unity | HDRP高清渲染管线学习笔记:HDRP光照系统(二)

目录 一、光源类型和模式 1. Light组件 1.1 General&#xff08;通用设置&#xff09; 1.1.1 LightLayer&#xff08;光照层&#xff09; 1.2 Emission&#xff08;发光设置&#xff09; 1.3 Shadows&#xff08;阴影&#xff09; 二、Light Layer&#xff08;光源分层&…

【C/C++实战项目】扫雷游戏

目录 项目分析 外部头文件 初始化 打印 扫雷游戏函数 main函数 项目分析 游戏需要自定义地图的大小、埋雷的数量通过输入坐标进行扫雷&#xff0c;输入的坐标是埋雷的地方&#xff0c;则游戏失败输入的坐标未埋雷&#xff0c;则该坐标显示周围8个坐标总共的雷数游戏初始…