算法通关村——数字中的统计、溢出、进制转换处理模板

news2025/1/20 21:51:56

数字与数学基础问题

1、数字统计

1.1、符号统计

LeetCode1822. 给定一个数组,求所有元素的乘积的符号,如果最终答案是负的返回-1,如果最终答案是正的返回1,如果答案是0返回0.

这题其实只用看数组中0和负数的个数就好了,数组中有0的话,最后的结果肯定是0,数组中负数的个数是奇数的话,最终结果就是负的,偶数个的话结果就是正的。代码如下:

public int arraySign(int[] nums) {
    int prod = 1;
    for (int i = 0; i < nums.length; i++) {
        if (nums[i] == 0) {
            return 0;
        } else if (nums[i] < 0) {
            //直接交替就好了,很好的处理技巧
            prod = -prod;
        }
    }
    return prod;
}

1.2、阶乘结果中末尾0的个数

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

这题如果硬算的话肯定会花费很多时间,我们可以换个角度思考,如果一个数的末尾有0,肯定是乘过10的,而10是由 2 * 5得来的,所以只用统计2和5一起出现多少对,不过因为2出现的次数一定大于5出现的次数,因此我们只需要统计5出现的次数就好了。在统计的过程中,我们只需要统计5、10、15、…… 5 n 5^n 5n这样5的整数倍就好了,最后累加起来,就是多少个0。代码如下:

public int trailingZeroes(int n) {
	int cnt = 0;
    for (long num = 5; n / num > 0; num *= 5) {
        cnt += n / num;
    }
    return cnt;
}

这里num * 5 是因为 n / num 首先计算的是从1到n数中包含1个5的个数,比如1 * 5 = 5,2 * 5 = 10,然后计算的是包含2个5的个数,比如5 * 5 = 25,5 * 5 * 2 = 50,以此类推,加起来就是最终结果中含5的个数。

2、溢出问题

2.1、整数反转

LeetCode7. 给你一个32位的有符号整数x,返回将x中的数字部分反转后的结果。如果反转后整数超过32位的有符号整数的范围[-2^31 , 2^31 - 1],就返回0.假设环境不允许存储64位整数(有符号或无符号)。

这题需要考虑溢出的问题,比如1147483649这个数字,它是小于最大的32位整数2147483647的,但是将这个数字反转过来后就变成了9463847411,这就比最大的32位整数还要大了,这样的数字是没法存到int中的,所以就溢出了。

取得一个数中的各个位上的数字很简单,循环取模即可,例如取得12345的各个数位上的数字,首先将12345 % 10 = 5,就得到个位数上的数字5,然后将12345 / 10 = 1234,这样再继续模10就好了,如下图所示:

image-20231119215422255

这是正数的情况,如果再考虑负数的话,可以将循环设置为while(x != 0)。因为无论是正数还是负数,按照上面不断的/10操作,最后都会变为0,所以判断终止条件就是 != 0。

再就是怎么去处理溢出的问题,我们需要从倒数第二位开始判断是否溢出,因为如果直接比较最终的结果的话,像上面所讲到的,一旦数溢出的话int是存不下的,所以得提前判断。而32位最大整数MAX=2147483647,它的倒数第二位是4,所以就要分析结果的倒数第二位和4的大小关系,如下所示:

image-20231119220454350

  • 如果res > 214748364,那最后一位要接上的数就不用看了,肯定溢出了
  • 如果res = 214748364,就需要跟最大数的最后一个数字相比,如果比7大,那就说明溢出了
  • 如果res < 214748364,继续处理即可,不会溢出

对于负数同理,代码如下:

public int reverse(int x) {
    int res = 0;
    while(x != 0) {
        //获得末尾数字
        int temp = x % 10;
        //判断是否大于最大的32位整数
        if (res > Integer.MAX / 10 || (res == Integer.MAX / 10 && temp > 7)) {
            return 0;
        }
        //判断是否小于最小的32位整数
        if (res < Integer.MIN / 10 || (res == Integer.MIN / 10 && temp < -8)) {
            return 0;
        }
        res = res * 10 + temp;
        x /= 10;
    }
    return res;
}

3、进制专题

3.1、进制转换

给定一个十进制数M,以及需要转换的进制数N,将十进制数M转化位N进制数。M是32位整数,2<=N<=16.

对于这个问题,需要处理以下的几个点:

  • 超过进制最大范围后需要映射到其他进制,比如用ABCDEF去表示数
  • 需要对结果进行转置
  • 需要判断符号

用以下三个措施可以比较方便的去处理这个问题:

  • 定义大小位16的数组F,保存的是2到16的各个进制的值对应的标记,这样赋值时只计算下标,不必考虑不同进制的转换关系
  • 使用StringBuffer完成数组转置等功能
  • 通过一个flag来判断正数还是负数
//要考虑到余数>9的情况,2 <= N <= 16
public static final String[] F = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"};

//将十进制数M转化位N进制数
public String convert(int M, int N) {
    if (M < 0) {
        flag = true;
        M * -1;
    }
    StringBuffer sb = new StringBuffer();
    int temp;
    while(M != 0){
        temp = M % N;
        sb.append(F[temp]);
        M = M / N;
    }
    sb.reverse();
    return (flag ? "-" : "") + sb.toString();
}


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

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

相关文章

基于卡尔曼滤波实现行人目标跟踪

目录 1. 作者介绍2. 目标跟踪算法介绍2.1 目标跟踪背景2.2 目标跟踪任务分类2.3 目标跟踪遇到的问题2.4 目标跟踪方法 3. 卡尔曼滤波的目标跟踪算法介绍3.1 所用数据视频说明3.2 卡尔曼滤波3.3 单目标跟踪算法3.3.1 IOU匹配算法3.3.2 卡尔曼滤波的使用方法 3.4 多目标跟踪算法 …

【顺序表的实现】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 1. 数据结构相关概念 1、什么是数据结构 2、为什么需要数据结构&#xff1f; 2、顺序表 1、顺序表的概念及结构 1.1 线性表 2、顺序表分类 3、动态顺序表的实现 总…

高效管理文件:如何通过文件数量归类提高工作效率

在日常生活和工作中&#xff0c;需要处理大量的文件和资料。然而&#xff0c;如果这些文件没有得到妥善的管理&#xff0c;就会使得我们花费大量的时间和精力去寻找和整理它们。对于大量文件&#xff0c;按照数量归类可以使得文件管理更加有序和规范。根据文件的数量建立相应的…

中国电影票房排行数据爬取及分析可视化

大家好&#xff0c;我是带我去滑雪&#xff01; 对中国电影票房排行数据的爬取和分析可视化具有多方面的用处&#xff1a;例如了解电影市场的历史趋势&#xff0c;包括不同类型电影的受欢迎程度、票房的季节性波动。识别观众对于不同类型电影的偏好&#xff0c;为电影制片方提供…

Linux下快速确定目标服务器支持哪些协议和密码套件

实现原理是利用TLS协议的特点和握手过程来进行测试和解析响应来确定目标服务器支持哪些TLS协议和密码套件。 在TLS握手过程中&#xff0c;客户端和服务器会协商并使用相同的TLS协议版本和密码套件来进行通信。通过发送特定的握手请求并分析响应&#xff0c;可以确定目标服务器…

Linux 零拷贝splice函数

Linux splice 函数简介 splice 是 Linux 系统中用于在两个文件描述符之间移动数据的系统调用。它的主要作用是在两个文件描述符之间传输数据&#xff0c;而无需在用户空间进行数据拷贝。也是零拷贝操作. 函数原型 #include <fcntl.h> ssize_t splice(int fd_in, loff_…

git常用命令和参数有哪些?【git看这一篇就够了】

文章目录 前言常用命令有哪些git速查表奉上常用参数后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;git操作相关 &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出…

数电实验-----实现74LS139芯片扩展为3-8译码器以及应用(Quartus II )

目录 一、74LS139芯片介绍 芯片管脚 芯片功能表 二、2-4译码器扩展为3-8译码器 1.扩展原理 2.电路图连接 3.仿真结果 三、3-8译码器的应用&#xff08;基于74ls139芯片&#xff09; 1.三变量表决器 2.奇偶校验电路 一、74LS139芯片介绍 74LS139芯片是属于2-4译码器…

设计模式-组合模式-笔记

“数据结构”模式 常常有一些组件在内部具有特定的数据结构&#xff0c;如果让客户程序依赖这些特定数据结构&#xff0c;将极大地破坏组件的复用。这时候&#xff0c;将这些特定数据结构封装在内部&#xff0c;在外部提供统一的接口&#xff0c;来实现与特定数据结构无关的访…

【libGDX】使用ShapeRenderer绘制几何图形

1 ShapeRenderer 简介 ShapeRenderer 是 libGDX 中用于绘制基本形状的工具之一。它可以绘制点、线、矩形、多边形、圆形、椭圆形、扇形、立方体、圆锥体等几何图形。这对于在游戏或图形应用程序中绘制简单的形状是很有用的。 ShapeRenderer 的主要方法如下&#xff1a; 1&…

10_6 input输入子系统,流程解析

简单分层 应用层 内核层 --------------------------- input handler 数据处理层 driver/input/evdev.c1.和用户空间交互,实现fops2.不知道数据怎么得到的,但是可以把数据上传给用户--------------------------- input core层1.维护上面和下面的两个链表2.为上下两层提供接口--…

深度学习:欠拟合与过拟合

1 定义 1.1 模型欠拟合 AI模型的欠拟合&#xff08;Underfitting&#xff09;发生在模型未能充分学习训练数据中的模式和结构时&#xff0c;导致它在训练集和验证集上都表现不佳。欠拟合通常是由于模型太过简单&#xff0c;没有足够的能力捕捉到数据的复杂性和细节。 1.2 模型…

Python 自动化(十七)ORM操作

ORM-查询操作 查询简介 数据库的查询需要使用管理器对象 objects 进行 通过 自定义模型类.objects 管理器调用查询方法 查询方法 all()方法 概念与理解 用法&#xff1a;自定义模型类.objects.all()作用&#xff1a;查询自定义模型实体中所有的数据等同于 select * fr…

第八部分:JSP

目录 JSP概述 8.1&#xff1a;什么是JSP&#xff0c;它有什么作用&#xff1f; 8.2&#xff1a;JSP的本质是什么&#xff1f; 8.3&#xff1a;JSP的三种语法 8.3.1&#xff1a;jsp头部的page指令 8.3.2&#xff1a;jsp中的常用脚本 ①声明脚本&#xff08;极少使用&#xf…

【Python仿真】基于EKF的传感器融合定位

基于EKF的传感器融合定位&#xff08;Python仿真&#xff09; 简述1. 背景介绍1.1. EKF扩展卡尔曼滤波1.1.1.概念1.1.2. 扩展卡尔曼滤波的主要步骤如下&#xff1a;1.1.3. 优、缺点 1.2. 航位推算1.3. 目前航位算法的使用通常与卡尔曼滤波相结合使用2. 分段代码 2.1. 导入需要的…

【Go入门】 Go如何使得Web工作

【Go入门】 Go如何使得Web工作 前面小节介绍了如何通过Go搭建一个Web服务&#xff0c;我们可以看到简单应用一个net/http包就方便的搭建起来了。那么Go在底层到底是怎么做的呢&#xff1f;万变不离其宗&#xff0c;Go的Web服务工作也离不开我们第一小节介绍的Web工作方式。 w…

Java --- JVM之垃圾回收相关算法

目录 一、垃圾标记算法 1.1、垃圾标记阶段&#xff1a;对象存活判断 1.2、引用计数算法 1.3、可达性分析算法 1.4、GC Roots 二、对象的finalization机制 2.1、生存还是死亡&#xff1f; 三、查看GC Roots 3.1、使用MAT查看 四、使用JProfiler分析OOM 五、清除阶段算…

系列五、怎么查看默认的垃圾收集器是哪个?

一、怎么查看默认的垃圾收集器是哪个 java -XX:PrintCommandLineFlags -version

SpringBoot项目连接linux服务器数据库两种解决方法(linux直接开放端口访问本机通过SSH协议访问,以mysql为例)

最近找个springboot脚手架重新熟悉一下springboot相关框架的东西&#xff0c;结果发现好像项目还不能直接像数据库GUI工具一样填几个SSH参数就可以了&#xff0c;于是就给他再整一下看看如何解决 linux开放3306&#xff08;可修改&#xff09;端口直接访问 此方法较为方便&am…

【数据结构&C++】二叉平衡搜索树-AVL树(25)

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 一.AVL树的概念二.AVL树节点的定义(代码…