算法通关村第十三关—数学与数学基础问题(青铜)

news2024/12/30 3:05:16

      数学与数学基础问题

一、统计专题

1.1 符号统计

 LeetCode1822给定一个数组,求所有元素的乘积的符号,如果最终答案是负的返回-1,如果最终答案是正的返回1,如果答案是0返回0。
 题目比较简单,正数对结果完全没影响,只需判断有多少个负数和是否有0即可

class Solution {
    public int arraySign(int[] nums) {
        int judge = 1;
        for(int num: nums){
            if(num == 0) return 0;
            if(num < 0) judge *= -1;
        }
        return judge == 1 ? 1 : -1;
    }
}

1.2 阶乘0的个数

 Leetcode 172 给定一个整数n,返回 n!结果中尾随零的数量。
 这道题需要统计尾数有多少个0,那其实可以想成有多少对5和2,而5的数量是一定是少于2的,所以统计出5的个数即可得出结果

class Solution {
    public int trailingZeroes(int n) {
        int sum = 0;
        //求出所有5的倍数
        for(int i = 5; i <= n; i += 5){
            //这些数可以拆出多少个5
            for(int k = i; k % 5 == 0; k /= 5) sum++;
        }
        return sum;
    }
}

 当然,这道题还可以进行优化,例如:当某个数x是5的倍数时,当5^1 <= x < 5^2 时,它只含有一个5,像5,10,15,20;而当5^2 <= x< 5^3 时它包含两个5。所以,我们可以利用上述例子来计算0的个数。sum = n/5+n/(5^2)+…

lass Solution {
    public int trailingZeroes(int n) {
        int sum = 0;
       
        for(int i = 5; n / i > 0; i *= 5){
            sum += n / i;
        }
        return sum;
    }
}

二、溢出问题

2.1 整数反转

 LeetCode7 给你一个32位的有符号整数x,返回将x中的数字部分反转后的结果。如果反转后整数超过32位的有符号整数的范围[-231,231一1],就返回0。假设环境不允许存储64位整数(有符号或无符号)
image.png
 这道题要解决两个关键问题:1.如何进行整数反转;2.如何判断溢出
 对于整数反转,只需要创建另外一个变量rev来反转即可,不需要复杂的数据结构

例:123
123 % 10 = 3, 123 / 10 = 12 
rev = 0 * 10 + 3 = 3

12 % 10 = 2, 12 / 10 = 1
rev = 3 * 10 + 2 = 32

1 % 10 = 1, 1 / 10 = 0
rev = 32 * 10 + 1 = 321

 对于溢出问题,当int溢出时,会无法得到你正常运算结果的数,这里有两种解决方法。一种是讲义中对溢出的前一位就进行判断,另外一种我是用long类型变量来保存反转结果,这样可以在反转完一次性判断是否溢出。两种写法代码如下:

//第一种 讲义
class Solution {
    public int reverse(int x) {
        int rev = 0;
        while(x != 0){
            int max = Integer.MAX_VALUE;
            int min = Integer.MIN_VALUE;
            if(rev > max / 10 || (rev == max / 10 && x % 10 > max % 10)) return 0;
            if(rev < min / 10 || (rev == min / 10 && x % 10 < min % 10)) return 0;
            rev = rev * 10 + x % 10;
            x /= 10;
        }
        return rev;
    }
}
//第二种 自己发现的,时间复杂度也是击败100%
class Solution {
    public int reverse(int x) {
        long rev = 0;
        while(x != 0){
            rev = rev * 10 + x % 10;
            x /= 10;
        }
        if(rev > Integer.MAX_VALUE || rev < Integer.MIN_VALUE) return 0;
        return (int)rev;
    }
}

2.2 字符串转整数

Leetcode 8 :在字符串一关中

2.3 回文数

 LeetCode9 给你一个整数x,如果x是一个回文整数,返回true;否则,返回false
 根据题目要求,我们可以对整数x进行反转后与原数进行比较,若相等则为回文数,但这样要考虑溢出问题。所以,可以考虑反转一半的数,然后前后两部分进行比较。(注意考虑整数位数的奇偶)
代码如下:

public boolean isPalindrome(int x){
//特殊情况:
//如上所述,当x<0时,x不是回文数。
//同样地,如果数字的最后一位是0,为了使该数字为回文,
//则其第一位数字也应该是0
//只有0满足这一属性
if(x < 0 || (x % 10 = 0 && × != 0)) return false;
int revertedNumber 0;
while (x > revertedNumber){
revertedNumber = revertedNumber 10 + x % 10;
x /= 10;
}
//当数字长度为奇数时,我们可以通过revertedNumber/10去除处于中位的数字。
//例如,当输入为12321时,在while循环的末尾我们可以得到x=12,revertedNumber=123
//由于处于中位的数字不影响回文(它总是与自己相等),所以我们可以简单地将其去除。
return x == revertedNumber || x == revertedNumber / 10;
}

巧妙地化字符串,利用reverse()方法求解

class Solution {
    public boolean isPalindrome(int x) {
        String reversedStr = (new StringBuilder(x + "")).reverse().toString();
        return (x + "").equals(reversedStr);
    }
}

三、进制专题

3.1 七进制数

 LeetCode504.给定一个整数num,将其转化为7进制,并以字符串形式输出。其中-107<=num<=107。
 给定一个整数将其转换成7进制的主要过程是循环取余和整除,最后将所有的余数反过来即可。例如,将十进制数101转成七进制:

示例:101
101÷7=143
14÷7=20
2÷7=02
结果:203

注意如果是负数,要先把负号取出来再计算。

class Solution {
    public String convertToBase7(int num) {
        StringBuffer str = new StringBuffer();
        if(num == 0) return "0";
        int judge = 1;
        if(num < 0){
            judge = -1;
            num = -1 * num;
        }
        while(num != 0){
            str.append("" + num % 7);
            num /= 7;
        }
        if(judge == -1) str.append("-");
        return str.reverse().toString();
    }
}

3.2 进制转换

 给定一个十进制数M,以及需要转换的进制数N,将十进制数M转化为N进制数。M是32位整数,2<=N<=16。
 这个题目的思路不复杂,但是想写正确却很不容易,本题有好几个需要处理的问题:
1.超过进制最大范围之后如何准确映射到其他进制,特别是ABCDEF这种情况。简单的方式是大量采用if判断,但是这样写代码太多了
2.需要对结果进行一次转置。
3.需要判断负号。
 下面这个是讲义总结出的最精简,最容易理解的实现方案。注意采取三个措施来方便处理:
1.定义大小为16的数组F,保存的是2到16的各个进制的值对应的标记,这样赋值时只计算下标,不必考虑不同进制的转换关系了。(绝妙)
2.使用StringBuffer的reverse()完成数组转置等功能,如果不记得这个方法,工作量直接飙升。
3.通过一个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){
    Boolean flag = false;
    if(M < 0){
        flag = true;
        M *= -1;
    }
    StringBuffer sb = new StringBuffer();
    int temp;
    while(M != 0){
        temp = M % N;
        //技巧一:通过数组F[]解决了大量繁琐的不同进制之间映射的问题
        sb.append(F[temp]);
        M = M / N;
    }
    //技巧二:使用StringBuffer的reverse()方法,让原本麻烦的转置瞬间美好
    sb.reverse();
    //技巧三:最后处理正负,不要从一开始就揉在一起。
    return (flag ? "-" : "") + sb.toString();
}

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

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

相关文章

RK3568驱动指南|第八篇 设备树插件-第75章ConfigFS的核心数据结构

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

【Docker】进阶之路:(九)Docker网络

【Docker】进阶之路&#xff1a;&#xff08;九&#xff09;Docker网络 Docker网络模式简介bridge网络模式host网络模式none网络模式container网络模式user-defined网络模式1.创建自定义的bridge网络2.使用自定义网络 高级网络配置docker network命令 为什么要了解容器的网络模…

谈谈MYSQL主从复制原理

目录 概述 要点binlog日志 主从复制过程 总结 概述 MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。 MySQL 默认采用异步复制方式。从节点不用一直访问主服务器来更新自己的数据&#xff0c;数据的更新可以在远程连接上进行&#xff0…

Python应用利器:缓存妙用,让你的程序更出色更快速!

在 Python 应用程序中&#xff0c;使用缓存能够显著提高性能并降低资源消耗。本文将详细介绍如何在 Python 中实现缓存机制&#xff0c;包括内置 functools 模块提供的 lru_cache 装饰器以及自定义缓存机制。 使用 functools 模块的 lru_cache functools 模块提供了 lru_cach…

【CDP】CDP 集群通过Knox 访问Yarn Web UI,无法跳转到Flink Web UI 问题解决

一、前言 记录下在CDP 环境中&#xff0c;通过Knox 访问Yarn Web UI&#xff0c;无法跳转到Flink Web UI 的BUG 解决方法。 二、问题复现 登录 Knox Web UI 找到任一 Flink 任务 点击 ApplicationMaster 跳转 Flink WEB UI 出问题 内容空白&#xff0c;无法正常跳转到…

【MySQL】mysql | mysql5.7升级8.0注意事项

一、说明 1、应公司要求&#xff0c;mysql5.7安全漏洞较多&#xff0c;需要升级到8.0 2、记录注意事项备不时之需 二、注意事项 1、加密算法 1&#xff09;加密算法8.0改了&#xff0c;导致navicat无法连接 2&#xff09;解决&#xff1a; use mysql; ALTER USER root% IDENT…

利用冒泡排序了解如何将数组作为参数传递给函数

目录 前言:冒泡排序简介步骤动图演示 错误的冒泡排序函数数组名正确的冒泡排序函数 前言:冒泡排序 简介 冒泡排序是一种简单直观的排序算法。 它重复地访问要排序的数&#xff0c;一次比较两个元素&#xff0c;如果他们的顺序错误就把他们交换过来。访问数需要重复地进行直到…

DS冲刺整理做题定理(一)二叉树专题

&#xff08;只总结博主自己记得不熟的~&#xff09; 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下&#xff0c;精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技…

微服务——分布式事务

事务理论基础 分布式锁保证多线程下数据库操作安全保障 分布式事务发生异常可以回滚. 使用postman发送请求插入一条新订单。 然后现在库存只剩下8个商品&#xff0c;如果买10个的话应该统一失败。 CAP定理 假如node03在独立时将所有请求都堵塞并等待恢复和其余节点的连接的话以…

【Spring Boot】快速入门

一、引言 1、什么是spring boot&#xff1f; Spring Boot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。通过这种方式&#xff…

【c++】stl_priority_queue优先级队列

目录 一、priority_queue的介绍 二、 priority_queue的本质 三、priority_queue的使用 四、priority_queue的模拟实现 总结 一、priority_queue的介绍 首先让我们通过阅读优先级队列的官方文档 简单翻译一下 1. 优先队列是一种容器适配器&#xff0c;根据严格的弱排序标准…

内存不够用怎么办?整理了几个必备的方法!

内存越大&#xff0c;运行越快&#xff0c;程序之间的切换和响应也会更加流畅。但是随着时间的增加&#xff0c;还是堆积了越来越多的各种文件&#xff0c;导致内存不够用&#xff0c;下面就像大家介绍三种好用的清理内存的方法。 方法一&#xff1a;通过电脑系统自带的性能清理…

关于Android studio新版本和NEW UI显示返回按钮的设置

1.新版Android studio问题 因为在新版本的Android Studio中&#xff0c;默认情况下是没有直接的选项来显示返回上一步按钮在状态栏上的&#xff0c;可以通过以下方法来实现返回上一步的功能&#xff1a; 在Android Studio的顶部菜单栏中&#xff0c;选择"View"。在…

量子纠错率提高100倍!亚马逊云科技开启量子创新时代

由AWS开发和制造的包装组件中的超导量子芯片&#xff08;图片来源&#xff1a;网络&#xff09; 作为一项尖端技术&#xff0c;量子计算能提供前所未有的计算能力。美国亚马逊云科技&#xff08;AWS&#xff09;近期推出了一款量子芯片&#xff0c;展示出该技术取得了重大飞跃…

为什么选择国产WordPress:HelpLook的优势解析

如今网站建设可以说已经是企业必备。而在众多的网站建设工具中&#xff0c;WordPress无疑是其中的佼佼者。作为一款开源的CMS&#xff08;内容管理系统&#xff09;&#xff0c;WordPress拥有丰富的插件和主题&#xff0c;以及强大的功能&#xff0c;使得用户可以轻松地构建出符…

golang 操作Jenkins

1.創建Agent/Node func CreateAgent(username string, password string, nodeName string, nodeDescription string, numExecutors string, remoteFS string, labelString string, host string) {var obj stringobj "{name:" nodeName ",nodeDescription:&q…

洛谷 P8802 [蓝桥杯 2022 国 B] 出差

文章目录 [蓝桥杯 2022 国 B] 出差题目链接题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 思路解析CODE [蓝桥杯 2022 国 B] 出差 题目链接 https://www.luogu.com.cn/problem/P8802 题目描述 A \mathrm{A} A 国有 N N N 个城市&#xff0c;编号为 1 … N …

抖音跑腿小程序开发指南:从零开始到上线

如今&#xff0c;抖音跑腿小程序的开发已经成为一项具有巨大潜力的领域。本文将为您提供一份详尽的开发指南&#xff0c;从零开始引导您完成一个成功的抖音跑腿小程序的开发和上线过程。 第一步&#xff1a;确定目标和需求 了解用户的期望&#xff0c;确定小程序的功能模块&a…

ROS-ROS通信机制-小乌龟

文章目录 1.话题发布2.话题订阅3.服务调用4.参数设置5.通信机制比较 1.话题发布 需求描述: 编码实现乌龟运动控制&#xff0c;让小乌龟做圆周运动。 实现分析: 乌龟运动控制实现&#xff0c;关键节点有两个&#xff0c;一个是乌龟运动显示节点 turtlesim_node&#xff0c;另…

在RHEL8中如何使用 SELinux

本章主要介绍在RHEL8中如何使用 SELinux。 了解什么是 SELinux 了解 SELinux 的上下文 配置端口上下文 了解SELinux的布尔值 了解SELinux的模式 在 Windows系统中安装了一些安全软件后&#xff0c;当执行某个命令时&#xff0c;如果安全软件认为这个 命令对系统是一种危害&a…