【力扣刷题 | 第十四天】

 

目录

前言:

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;
    }
};

 总结;

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android大图加载优化方案,避免程序OOM

我们在编写Android程序的时候经常要用到许多图片&#xff0c;不同图片总是会有不同的形状、不同的大小&#xff0c;但在大多数情况下&#xff0c;这些图片都会大于我们程序所需要的大小。比如微博长图&#xff0c;海报等等。所以我们就要对图片进行局部显示。 大图加载基本需求…

Redis入门(5)-set

Redis中set的元素具有无序性与不可重复性 1.sadd key member[member] 添加元素&#xff0c;若元素存在返回0若不存在则添加 sadd DB mysql oracle sadd DB mysql sadd DB db22.smembers key 查看set中所有元素 smembers DB3.sismember key member 判断元素在set中是否存…

GIS 功能模块实现

文章目录 1. GIS 模块流程图2. 网页端地图缓存的实现3. GIS 图形操作功能实现1 &#xff09;地图漫游2 &#xff09;对象删除3 &#xff09;选择复制属性查看 GIS 基本功能模块主要是在表现层开发的&#xff0c;是在OpenLayers 开发框架提供的接口上&#xff0c;通过Geo Server…

智芯MCU软件开发环境搭建

智芯MCU软件开发环境搭建 目录 智芯MCU软件开发环境搭建前言1 软件安装2 编译环境3 烧录环境4 新建工程结束语 前言 智芯科技的MCU主要应用于汽车行业&#xff0c;属于车规级的MCU&#xff0c;目前上市的MCU型号较少&#xff0c;相关资料也不多&#xff0c;所以这里出一期开发…

uniapp实现tab切换可以滚动的效果

实现效果 当 tab 切换的内容很多时&#xff0c;需要用到滚动&#xff0c;希望在点击 tab 的时候可以自动滑动到对应的tab下 知识点 scrollIntoView&#xff1a;该scrollIntoView()方法将调用它的元素滚动到浏览器窗口的可见区域。 语法 element.scrollIntoView&#xff08…

【kubernetes】部署controller-manager与kube-scheduler

前言:二进制部署kubernetes集群在企业应用中扮演着非常重要的角色。无论是集群升级,还是证书设置有效期都非常方便,也是从事云原生相关工作从入门到精通不得不迈过的坎。通过本系列文章,你将从虚拟机准备开始,到使用二进制方式从零到一搭建起安全稳定的高可用kubernetes集…

记录正式环境测试环境【RedHat7编译升级redis7.0.9】--有关报错及解决

记录正式环境&测试环境【RedHat7 编译升级redis7.0.9】--有关报错及解决 &#x1f53b; 一、报错详情1.1 ⛳ 写在前面1.2 ⛳ 报错11.3 ⛳ 报错21.4 ⛳ 安装redis1.5 ⛳ 版本检查 &#x1f53b; 二、⛳ 总结 &#x1f53b; 一、报错详情 1.1 ⛳ 写在前面 &#x1f341; 升级…

王道计算机网络学习笔记(3)——数据链路层

前言 文章中的内容来自B站王道考研计算机网络课程&#xff0c;想要完整学习的可以到B站官方看完整版。 三&#xff1a;数据链路层 3.1&#xff1a;数据链路层功能概述 结点&#xff1a;主机、路由器 链路&#xff1a;网络中两个结点之间的物理通道&#xff0c;链路的传输介…

【DeepLearning】Ubuntu中深度学习环境配置完整流程

Ubuntu中深度学习环境配置完整流程 1 显卡驱动2 cuda3 cuDNN4 torch5 torchvision 1 显卡驱动 支持 cuda 的所有显卡型号: Link 查询显卡型号 lspci -nn | grep VGA即 Vendor ID:Device ID 为 10de:21c4&#xff0c;在浏览器或者 Link 中搜索。 填写显卡信息: Link 选择要下载…

数据结构——快速排序的介绍

快速排序 快速排序是霍尔(Hoare)于1962年提出的一种二叉树结构的交换排序方法。快速排序是一种常用的排序算法&#xff0c;其基本思想是通过选择一个元素作为"基准值"&#xff0c;将待排序序列分割成两个子序列&#xff0c;其中一个子序列的元素都小于等于基准值&am…

SpringBoot集成WebSocket实现消息实时推送(提供Gitee源码)

前言&#xff1a;在最近的工作当中&#xff0c;客户反应需要实时接收消息提醒&#xff0c;这个功能虽然不大&#xff0c;但不过也用到了一些新的技术&#xff0c;于是我这边写一个关于我如何实现这个功能、编写、测试到部署服务器&#xff0c;归纳到这篇博客中进行总结。 目录 …

【计算机网络自顶向下】计算机网络期末自测题(一)

前言 “(学不懂一点) &#xff08;阴暗的爬行&#xff09;&#xff08;尖叫&#xff09;&#xff08;扭曲&#xff09;&#xff08;阴暗的爬行&#xff09;&#xff08;尖叫&#xff09;&#xff08;扭曲&#xff09;&#xff08;阴暗的爬行&#xff09;&#xff08;尖叫&#…

LeetCode·1262. 可被三整除的最大和·贪心

作者&#xff1a;小迅 链接&#xff1a;https://leetcode.cn/problems/greatest-sum-divisible-by-three/solutions/2314049/tan-xin-zhu-shi-chao-ji-xiang-xi-by-xun-r0n76/ 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 著作权归作者所有。商业转载请联系作者获得…

vscode 调试

目录 准备 GDB 调试方法 问题 准备 然后点击 文件-打开文件夹&#xff0c;找到创建的代码路径&#xff0c;确定后&#xff0c;在左侧的资源管理器可以看到代码文件。 第一次运行需要安装 c 的扩展&#xff0c;在扩展页面中&#xff0c;安装 C/C 编译注意一定要加上 -g 指令…

Linux tar.xz 格式的文件正确的解压命令

Linux tar.xz 最近下载 Linux kernel&#xff0c;好像最近流行 tar.xz 格式的后缀 对于 xz 后缀的压缩文件&#xff0c;我之前的解压方式是分为两步&#xff1a; xz -d xxx.tar.xz 解压成 xxx.tar 格式文件&#xff0c;然后再 tar xf xxx.tar 解压文件。 这样的操作不仅比较的…

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

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

使用STM32F103的串口实现IAP程序升级功能

使用STM32F103的串口实现IAP程序升级功能 &#x1f3ac;IAP程序烧录全过程演示&#xff1a; ✨这几天折腾IAP升级功能&#xff0c;狂补了很多相关BootLoader相关的知识。本来最想实现IAP升级程序的方式是&#xff0c;基于SPI通讯的SD卡&#xff0c;借助挂载的FatFS文件系统&am…

【计网】第一章 计算机网络概述

文章目录 计算机网络概述一、计算机网络在信息时代中的作用二、互联网概述2.1 互连网概念2.2 网络的网络2.3 互连网基础结构发展的三个阶段2.4 互连网的标准化工作 三、互联网的组成3.1 互联网的边缘部分3.2 互联网的核心部分3.2.1 基础概念3.2.2 电路交换3.2.3 报文交换3.2.4 …

Baumer工业相机堡盟工业相机如何使用新版本NEOAPI SDK控制相机数据流的开启和关闭(C++)

Baumer工业相机堡盟工业相机如何使用新版本NEOAPI SDK控制相机数据流的开启和关闭&#xff08;C&#xff09; Baumer工业相机Baumer工业相机NEOAPI SDK的技术背景Baumer工业相机使用NEOAPISDK控制相机数据流的方式1.引用合适的类文件2.使用NEOAPISDK控制相机数据流的方式2.使用…

macOS Monterey 12.6.7 (21G651) 正式版发布,ISO、IPSW、PKG 下载

macOS Monterey 12.6.7 (21G651) 正式版发布&#xff0c;ISO、IPSW、PKG 下载 本站下载的 macOS 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。另外也支持…