【力扣刷题 | 第十四天】

news2025/1/14 9:39:00

 

目录

前言:

7. 整数反转 - 力扣(LeetCode) 

面试题 16.05. 阶乘尾数 - 力扣(LeetCode)

 总结;


前言:

        今天仍然是无固定类型刷题, 



7. 整数反转 - 力扣(LeetCode) 

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。

第一种思路:无脑拆解这个数组,然后利用reverse函数进行翻转后暴力相乘,在这期间特殊处理所有的特殊数字就可以,是一种效率最低的方法。

public:
    int reverse(int x) {
        vector<int> d1;
        int a=0;
        int judge=0;
        if(x==-2147483648)
        {
            return 0;
        }
        if(x<0)
        {
            judge=1;
            a=-x;
        }
        else
        {
            a=x;
        }
        while(a>0)
        {
            d1.push_back(a%10);
            a=a/10;

        }
       
       ::reverse(d1.begin(),d1.end());

       long long int sum=0;
        for(int i=0;i<d1.size();i++)
        {
            sum=sum+(d1[i]*pow(10,i));
        }
        if(judge==1)
        {
            sum=-sum;
        }
        if (-2147483648 < sum && sum < 2147483647)
        {
             return (int)sum;
        }
       return 0;
    }
};

第二种思路:

我们不需要将所给的数字拆分后再反转,然后再乘,可以直接就拆分相乘,然后对每一次得到的新数字进行判断是否溢出。

class Solution {
public:
    int reverse(int x) {
        int res = 0;
        while (x) {
            int digit = x % 10; // 取最后一位数字
            x /= 10; // 去掉最后一位数字
            // 判断乘10之前是否会溢出
            if (res > INT_MAX / 10 || (res == INT_MAX / 10 && digit > 7)) {
                return 0;
            }
            if (res < INT_MIN / 10 || (res == INT_MIN / 10 && digit < -8)) {
                return 0;
            }
            res = res * 10 + digit; // 将最后一位数字加到结果中
        }
        return res;
    }
};

我们着重解释一下这两个if判断句:

这段代码的作用是判断在每次将数字的最后一位加到结果中之前,是否会发生溢出现象。

由于最终的结果需要在int类型的有符号范围内,所以在判断当前结果res加上最后一位数字后是否会越界时,需要判断已经累加的结果res是否在INT_MAX / 10INT_MIN / 10的范围内。对于任何一个已经加入结果中的数字,如果加上下一位数字后会超过INT_MAX或者INT_MIN,那么结果一定会越界,这时就需要返回0。

对于正整数,如果加上最后一位数字后越界,那么最后一位数字一定不小于8,因为INT_MAX / 10等于214748364,所以INT_MAX / 10乘以10的结果是2147483640,而8乘以任何数一定小于等于80,所以如果最后一位数字是8或者更大的数,结果就一定会越界。

对于负整数,如果加上最后一位数字后越界,那么最后一位数字一定不大于-8,因为INT_MIN / 10等于-214748364,所以INT_MIN / 10乘以10的结果是-2147483640,而-8乘以任何数一定不大于-80,所以如果最后一位数字是-8或者更小的数,结果就一定会越界。

面试题 16.05. 阶乘尾数 - 力扣(LeetCode)

设计一个算法,算出 n 阶乘有多少个尾随零。

 这道题很多下意识的会采用求出阶乘结果之后再逐个判断的方式进行,但是这种方式存在一个问题:有的数字的阶乘结果都已经超出了int表示的范围,甚至是long lon int也不能容纳,这个时候又有人想到了用数组存储数字,示例:

vector<int> factorial(int n) {
    vector<int> res(1, 1); // 初始化数组为1
    for (int i = 2; i <= n; i++) { // 从2开始逐个计算
        int carry = 0;
        for (size_t j = 0; j < res.size(); j++) { // 从低位到高位逐位计算
            int num = res[j] * i + carry; // 乘积加上上一次的进位
            res[j] = num % 10; // 将当前位结果存回数组
            carry = num / 10; // 计算新的进位
        }
        while (carry > 0) { // 如果最高位仍有进位,需要往数组插入新的位
            res.push_back(carry % 10);
            carry /= 10;
        }
    }
    reverse(res.begin(), res.end()); // 将数组反转,转换成正序
    return res;
}

但是这些都太过于复杂。本题其实就是一个脑筋急转弯。

数末尾0其实很简单,有几个因子10,就有几个末尾0。而10又可以拆成2和5,在阶乘中2的数量一定大于5的数量,因此我们数5就可以了。有几个5就有几个10.

但因为25和其倍数,如25*2.。。。里面都有两个5,所以遇到25和倍数都要+2;

同理125和其倍数,里面有3个5,所以遇到125和其倍数要+3;

因为25是5的倍数,125是25的倍数,

也就是说25,125的倍数都和5的倍数是重叠的;

所以从n/5开始,然后+n/25,+n/125,依次类推,这样就等于进行叠加了,不用额外考虑什么情况+2,什么情况+3...的问题;

class Solution {
public:
    int trailingZeroes(int n) {
          int count = 0;
        while(n >= 5){
            n /= 5;
            count += n;
        }
        return count;
    }
};

 总结;

并不是所有的题都要依靠算法的思维逻辑来解决,有的时候我们不能钻牛角尖,总是试图找出一个可以套用的算法。

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

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

相关文章

傅氏变换算法

半局积分算法的局限性是要求采样的波形为正弦波。当被采样的模拟量不是正弦波而是一个周期性时间函数时&#xff0c;可采用傅氏变换算法。傅氏变换算法来自于傅里叶级数&#xff0c;即一个周期性函数I&#xff08;t&#xff09;可用傅里叶级数展开为各次谐波的正弦项和余弦项之…

D117-72. 编辑距离

题目描述 链接&#xff1a;添加链接描述 跟只考虑删除的完全一样&#xff0c;只不过是dp[i-1][j-1]1 class Solution:def minDistance(self, word1: str, word2: str) -> int:# dp[i][j]&#xff1a;以i-1为结尾的字符串word1&#xff0c;和以j-1位结尾的字符串word2&…

Qt 将某控件、图案绘制在最前面的方法,通过QGraphicsScene模块实现

文章目录 前言一、效果二、代码实现1.工程文件夹结构2.BackWidget类2.1 backwidget.h2.2 backwidget.cpp 总结 前言 在用Qt做一些应用的时候&#xff0c;有可能遇到和“绘制顺序”相关的问题&#xff0c;即要控制一些控件之间的显示前后问题&#xff0c;在常用的QWidget体系中&…

【数据结构与算法】力扣:翻转二叉树

翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xff1a;[2,…

云HIS是什么?HIS系统为什么要上云?云HIS有哪些优点?

一、当前医疗行业HIS的现状与发展趋势 1.医院信息系统&#xff08;HIS&#xff09;经历了从手工到单机再到局域网的两个阶段&#xff0c;随着云计算、大数据新技术迅猛发展&#xff0c;基于云计算的医院信息系统将逐步取代传统局域网HIS , 以适应人们对医疗卫生服务越来越高的要…

BI-SQL丨角色和用户

角色和用户 在数仓的运维工作中&#xff0c;经常需要为用户开通不同权限的账号&#xff0c;使用户可以正常访问不同的数据&#xff0c;那么这就需要我们了解SQL Server的权限体系。 名词解释 登录名&#xff1a; 用来登录服务器的用户账号&#xff0c;例&#xff1a;sa&…

String类型

前言 之所以介绍是因为基本数据类型是系统中一切操作的基础&#xff0c;就像物理世界中的原子&#xff0c;高楼大厦中的砖瓦。当咱们整明白了这些基本数据类型&#xff0c;使用层面就是挑选和组合的问题了。本文小结下Redis中数据结构和使用场景&#xff0c;如果你有更骚气的挑…

Python中文件的读取

在Python中可以通过内置函数open()、read()和readline()实现文件的读取。 1 打开文件函数 1.1 open()函数的基本用法 open()是Python的内置函数&#xff0c;用来打开指定文件。该函数使用代码如下所示&#xff1a; fin open(words.txt) 其中&#xff0c;参数指定了要打开…

【软件设计师暴击考点】计算机网络知识高频考点暴击系列

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;软件…

NodeJS Request下载图片文件到本地⑩⑦

文章目录 ✨文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持&#x1f618;前言使用模块创建文件删除文件写入图片案例效果总结 ✨文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持&#x1f…

网页前端制作需要哪些基础知识?

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言HTML基础知识1 HTM…

存款进阶“10万元门槛”,年轻人为何遭遇困境?

文章目录 ❗❗ 前言&#x1f48c;目前的存款在哪一个区间&#xff1f;你觉得存款难吗&#xff1f;&#x1f622;存钱到底有多难&#xff1f;&#x1f90d;为存款做出过哪些努力&#xff1f;&#x1f9e7;没钱更要理财吗&#xff1f;&#x1f194;影响年轻人存款能力和存款意愿的…

C++多态 动态联编 静态联编 虚函数 抽象类 final override关键字

C多态 多态多态原理 动态联编和静态联编纯虚函数和抽象类C11的final override关键字重载 隐藏 重写的区别 多态 1.派生类中定义虚函数必须与基类中的虚函数同名外&#xff0c;还必须同参数表&#xff0c;同返回类型。 否则被认为是同名覆盖&#xff0c;不具有多态性。 如基类中…

NCI Architecture

2.1 组成部分 NCI 可分为以下逻辑组件&#xff1a;  NCI 核心 NCI 核心定义了设备主机 (DH) 和 NFC 控制器 (NFCC) 之间通信的基本功能。 这使得 NFCC 和 DH 之间能够进行控制消息&#xff08;命令、响应和通知&#xff09;和数据消息交换。  传输映射 传输映射定义 N…

Excel百万级别数据的导入和导出【详细代码】

代码层级结构 DurationAspect package com.zhouyu.aspect;import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.A…

MFC 截图功能实现(2)

上篇文章里面所用的截图是点击按钮就截取当前打开的界面&#xff0c;链接&#xff1a; MFC 截图功能实现_春蕾夏荷_728297725的博客-CSDN博客 这里所用的截图是可以选中区域&#xff0c;另存为目录等的操作&#xff1a; 效果&#xff1a; 选中区域&#xff1a; 菜单&#xf…

javaee 任务调度,定时任务 多个任务同时执行

错误的写法 如果按照下图的写法&#xff0c;两个任务不会同时执行&#xff0c;因为是一个线程&#xff0c;两个任务是串行的关系。 可以看到第二个任务是等第一个任务执行完以后&#xff0c;才执行的。 正确的写法 使用线程池&#xff0c;为每一个任务创建一个线程 可以看…

Markdown中使用 LaTeX 编辑数学公式

Markdown中使用 LaTeX 编辑数学公式 1 介绍TeX&#xff08;计算机排版系统&#xff09;LaTeX&#xff08;TeX宏集&#xff09;KaTeX 和 MathJax 2 注意点单双美元符号包裹问题KaTeX 有些不支持 3 语法保留字符希腊字母希伯来字母二元运算符二元关系符几何符号逻辑符号集合符号箭…

Linux下一切皆文件的理解

目录 一. 回顾上文 Linux底层进程和被打开文件的映射关系图&#xff1a; Linux部分源代码示意图如下&#xff1a; ​编辑 二.Linux下一切皆文件的核心理解 一. 回顾上文 在前两篇文章中&#xff0c;我论述了Linux系统中关于文件基础IO的一些内容&#xff1a; 1.有关于文件…

RT-Thread-05-空闲线程和两个常用的钩子函数

空闲线程和两个钩子函数 空闲线程是一个比较特殊的系统线程&#xff0c;它具备最低优先级&#xff0c;当系统中无其他就绪线程可运行时&#xff0c;调度器将调度到空闲线程&#xff1b;空闲线程还负责一些系统资源回收以及将一些处于关闭状态的线程从线程调度列表中移除&#x…