算法必刷系列之数字与数学

文章目录

  • 数字与数学
    • 符号统计
    • 阶乘0的个数
    • 整数反转
    • 字符串转数字
    • 判断回文数字
    • 十进制转七进制
    • 进制转换
    • 数组实现整数加法
    • 字符串加法
    • 二进制求和
    • 求2的幂
    • 求3的幂
    • 求4的幂
    • 最大公约数
    • 最小公倍数
    • 判断质数
    • 质数计数
    • 判断丑数
    • 丑数计数

数字与数学

数字与数学的问题基础且庞大,算法问题中,一般涉及幂运算、阶乘、初等数论,如最大公约数、质数判断与计数等基础问题。

符号统计

leetcode1822
只要乘数中存在一个0,结果为0,整数不影响结果符号,偶数个负数相乘,结果为正,奇数个负数相乘结果为负

public int arraySign(int[] nums) {int res = 1;for(int i=0;i<nums.length;i++){if(nums[i]==0){return 0;}else if(nums[i]<0){res*=-1;}}return res;
}

阶乘0的个数

leetcode16.05
阶乘0的个数取决于2和5出现的次数,而5出现的次数明显大于2,所以只需要统计5,25,125等出现的次数即可。

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

整数反转

leetcode7
反转的过程就是原数字对10取余数,得到末尾数字,新数字乘10加上末尾数字。需要注意反转过程中的数字溢出问题。

public int reverse(int x) {int res = 0;while(x!=0){if(res>Integer.MAX_VALUE/10 || (res==Integer.MAX_VALUE/10 && x%10 > Integer.MAX_VALUE%10)){return 0;}if(res<Integer.MIN_VALUE/10 || (res==Integer.MIN_VALUE/10 && x%10 < Integer.MIN_VALUE%10)){return 0;}res = res*10+x%10;x = x/10;}return res;
}

字符串转数字

leetcode8
按照题目要求,以char数组的形式遍历字符串,去掉空白字符,设置正负数符号,字符➖字符0获得数值,乘10累加,注意数字溢出

public int myAtoi(String s) {int n = s.length();char[] chars = s.toCharArray();int sign = 1;int res = 0;int index = 0;while (index < n && chars[index] == ' ') {index++;}if (index == n) {return res;}if (chars[index] == '+') {index++;}else if (chars[index] == '-') {sign = -1;index++;}while (index < n) {if (chars[index] >= '0' && chars[index] <= '9') {if (res > Integer.MAX_VALUE / 10 || (res == Integer.MAX_VALUE / 10 && (chars[index]-'0') > Integer.MAX_VALUE % 10)) {return Integer.MAX_VALUE;}if (res < Integer.MIN_VALUE / 10 || (res == Integer.MIN_VALUE / 10 && (chars[index]-'0') > -(Integer.MIN_VALUE % 10))) {return Integer.MIN_VALUE;}res = res * 10 + sign * (chars[index] - '0');index++;} else {return res;}}return res;
}

判断回文数字

leetcode9
将数字反转一般并比较是否相等

public boolean isPalindrome(int x) {if(x<0 || x%10==0&&x!=0){return false;}int reverseNum=0;while(x>reverseNum){reverseNum = reverseNum*10+x%10;x/=10;}return x==reverseNum || x==reverseNum/10;
}

十进制转七进制

leetcode504
采用除商取余法,保存余数,最后将余数反转

public String convertToBase7(int num) {if(num==0){return "0";}boolean sign = true;if(num<0){num = -num;sign=false;}StringBuilder sb = new StringBuilder();while(num!=0){sb.append(num%7);num /= 7;}if(!sign){sb.append("-");}return sb.reverse().toString();
}

进制转换

采用除商取余法,保存余数,最后将余数反转,同时设置常数数组,保存A-F常数值,用来保存十六进制转换结果

public String convert(int num,int N) {final String[] F = new String[]{"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};if(num==0){return "0";}boolean sign = true;if(num<0){num = -num;sign=false;}StringBuilder sb = new StringBuilder();while(num!=0){sb.append(F[num%N]);num /= N;}if(!sign){sb.append("-");}return sb.reverse().toString();
}

数组实现整数加法

leetcode66
从末尾开始加1,如果有进位,前一位继续加1,直至加到数组下标为0的位置,如果仍有进位,创建新数组,设置下标0的位置值为1,并返回。

public int[] plusOne(int[] digits) {for(int i = digits.length - 1;i>=0;i--){digits[i]++;digits[i]%=10;if(digits[i]!=0){return digits;}}digits = new int[digits.length+1];digits[0] = 1;return digits;
}

字符串加法

从末尾开始遍历两个字符串,转换为数值,进行求和,计算进位,保存当前位,最后反转

public String addStrings(String num1, String num2) {int i = num1.length() - 1;int j = num2.length() - 1;int add = 0;StringBuilder sb = new StringBuilder();while (i >= 0 || j >= 0 || add != 0) {int x = i >= 0 ? num1.charAt(i) - '0' : 0;int y = j >= 0 ? num2.charAt(j) - '0' : 0;int res = x + y + add;add = res / 10;sb.append(res % 10);i--;j--;}return sb.reverse().toString();
}

二进制求和

leetcode67
与字符串求和本质相同,从末尾开始遍历两个字符串,转换为数值,进行求和,计算进位,保存当前位,最后反转

public String addBinary(String a, String b) {int i = a.length()-1;int j = b.length()-1;int ca = 0;StringBuilder sb = new StringBuilder();while(i>=0||j>=0||ca!=0){int x = i>=0?a.charAt(i)-'0':0;int y = j>=0?b.charAt(j)-'0':0;int res = x+y+ca;ca = res/2;sb.append(res%2);i--;j--;}return sb.reverse().toString();
}

求2的幂

leetcode231
求幂运算的模板如下,可能针对不同的数字有其独特的巧妙解法

public boolean isPowerOfTwo(int n) {if(n<=0){return false;}while(n%2==0){n/=2;}return n==1;
}

求2的幂巧妙解法,2的幂的二进制最高位为1,其余为为0,即n&n-1=0

public boolean isPowerOfTwo(int n) {return n>0 && (n&(n-1))==0;
}

求3的幂

leetcode326
模板

public boolean isPowerOfThree(int n) {if(n<=0){return false;}while(n%3==0){n/=3;}return n==1;}

在int类型范围内,3的幂的最大整数是1162261467,故只要是3的幂,一定可以被1162261467整除

public boolean isPowerOfThree(int n) {return n > 0 && 1162261467 % n == 0;
}

求4的幂

leetcode342
模板

public boolean isPowerOfFour(int n) {if(n<=0){return false;}while(n%4==0){n/=4;}return n==1;
}

4的幂一定是2的幂,且满足最高位为1,后面有偶数个0,可以通过n&0xaaaaaaaa来实现

public boolean isPowerOfFour(int n) {return n > 0 && (n & (n - 1)) == 0 && (n & 0xaaaaaaaa) == 0;
}

最大公约数

碾转相除法

public int gcd(int a, int b) {int k = 0;while (k!=0){k = a%b;a = b;b = k;};return a;
}

最小公倍数

两数乘积除以最大公约数

public int mcl(int a, int b) {int gcd = gcd(a, b);return a * b / gcd;
}

判断质数

从2开始,逐个将待判断的数除以从2到其平方根范围内的所有整数(包括平方根),如果能够整除,则该数不是质数。如果在整个范围内都没有找到能整除的数,则该数是质数。

public boolean isPrime(int num){int max = (int)Math.sqrt(num);for (int i = 2; i<=max;i++){if(num%i==0){return false;}}return true;
}

质数计数

leetcode204
循环遍历判断

public int countPrimes(int n) {int count = 0;for(int i=2;i<n;i++){if(isPrime(i)){count++;}}return count;
}public boolean isPrime(int num){int max = (int)Math.sqrt(num);for (int i = 2; i<=max;i++){if(num%i==0){return false;}}return true;
}

设置一个长度为n的数组,初始时,设置数组全为1,之后,从下标2开始遍历,如果数组当前值为1,质数计数器➕1,并将当前数字的倍数以及与倍数相关的非质数下标设置为0,最后返回质数计数器的值。

public int countPrimes(int n) {int[] isPrime = new int[n];int count = 0;Arrays.fill(isPrime,1);for(int i=2;i<n;i++){if(isPrime[i]==1){count++;if((long)i*i<n){for(int j=i*i;j<n;j+=i){isPrime[j]=0;}}}}return count;
}

判断丑数

leetcode263
可以直接根据丑数的概念进行判断。如果不包含质因数或者包含质因数 2、3 和 5 的正整数即为丑数

public boolean isUgly(int n) {if(n<=0){return false;}int[] factors = new int[]{2,3,5};for(int factor:factors){while(n%factor==0){n = n/factor;}}return n==1;
}

丑数计数

leetcode264
循环遍历判断

public int nthUglyNumber(int n) {int count = 0;int i=1;while(true){if(isUgly(i)){count++;if(count==n){return i;}}i++;}
}public boolean isUgly(int num){if(num<=0){return false;}int[] factors = new int[]{2,3,5};for(int factor:factors){while(num%factor==0){num = num/factor;}}return num==1;
}

设置一个小顶堆,初始时,将最小的丑数1加入队中,循环n次,每次将堆顶元素x移除,每次将2x,3x,5x放入堆中,为了避免重复,可以使用集合过滤,循环n次之后,最小的第n个丑数出堆返回

public int nthUglyNumber(int n) {int[] factors = {2, 3, 5};Set<Long> seen = new HashSet<Long>();PriorityQueue<Long> heap = new PriorityQueue<Long>();seen.add(1L);heap.offer(1L);int ugly = 0;for (int i = 0; i < n; i++) {long curr = heap.poll();ugly = (int) curr;for (int factor : factors) {long next = curr * factor;if (seen.add(next)) {heap.offer(next);}}}return ugly;
}

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

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

相关文章

c 语言线程的使用

在 C 语言中&#xff0c;可以使用 POSIX 线程&#xff08;pthread&#xff09;库来创建和管理线程。下面是一个简单的示例程序&#xff0c;演示如何在 C 语言中使用线程&#xff1a; #include <stdio.h> #include <stdlib.h> #include <pthread.h> voi…

【pytest】Hooks函数之统计测试结果(pytest_terminal_summary)

前言 用例执行完成后&#xff0c;我们希望能获取到执行的结果&#xff0c;这样方便我们快速统计用例的执行情况。 也可以把获取到的结果当成总结报告&#xff0c;发邮件的时候可以先统计测试结果&#xff0c;再加上html的报告。 pytest_terminal_summary 关于TerminalReporter…

Python pandas数据分析

Python pandas数据分析&#xff1a; 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&#xff0c;尤其…

枚举 B. Lorry

Problem - B - Codeforces 题目大意&#xff1a;给物品数量 n n n&#xff0c;体积为 v ( 0 ≤ v ≤ 1 e 9 ) v_{(0 \le v \le 1e9)} v(0≤v≤1e9)​&#xff0c;第一行读入 n , v n, v n,v&#xff0c;之后 n n n行&#xff0c;读入 n n n个物品&#xff0c;之后每行依次是体…

易错知识点(数学一)

一、反常积分判敛 1、构造使其极限等于一个大于0的常数 1&#xff09;前者通过&#xff1a;化等价无穷小 or 泰勒展开 2&#xff09;若存在p>1使得等式成立&#xff0c;则收敛 考察形式&#xff1a;1、已知收敛&#xff0c;求f(x)中的幂次取值范围 主要思想&#xff1a;比较…

⑧【HyperLoglog】Redis数据类型:HyperLoglog [使用手册]

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ Redis HyperLoglog ⑧Redis HyperLoglog基本操…

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(七)

分页查询、删除和修改菜品 1. 菜品分页查询1.1 需求分析和设计1.1.1 产品原型1.1.2 接口设计 1.2 代码开发1.2.1 设计DTO类1.2.2 设计VO类1.2.3 Controller层1.2.4 Service层接口1.2.5 Service层实现类1.2.6 Mapper层 1.3 功能测试1.3.2 前后端联调测试 2. 删除菜品2.1 需求分析…

使用 HTML、CSS 和 JavaScript 创建图像滑块

使用 HTML、CSS 和 JavaScript 创建轮播图 在本文中&#xff0c;我们将讨论如何使用 HTML、CSS 和 JavaScript 构建轮播图。我们将演示两种不同的创建滑块的方法&#xff0c;一种是基于opacity的滑块&#xff0c;另一种是基于transform的。 创建 HTML 我们首先从 HTML 代码开…

Linux系统的研究

摘要&#xff1a; Linux是一个开源的Unix-like操作系统&#xff0c;由林纳斯托瓦兹在1991年首次发布。由于其开放性和灵活性&#xff0c;Linux已成为许多企业和个人用户的重要选择。本文将探讨Linux系统的历史、特点、应用领域以及优缺点。 一、引言 Linux系统的开发始于1980年…

yolo系列中的一些评价指标说明

文章目录 一. 混淆矩阵二. 准确度(Accuracy)三. 精确度(Precision)四. 召回率(Recall)五. F1-score六. P-R曲线七. AP八. mAP九. mAP0.5十. mAP[0.5:0.95] 一. 混淆矩阵 TP (True positives)&#xff1a;被正确地划分为正例的个数&#xff0c;即实际为正例且被分类器划分为正例…

Redis-主从与哨兵架构

Jedis使用 Jedis连接代码示例&#xff1a; 1、引入依赖 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version> </dependency> 2、访问代码 public class JedisSingleTe…

JVM虚拟机:JVM调优第一步,了解JVM常用命令行参数

本文重点 从本文课程开始&#xff0c;我们将用几篇文章来介绍JVM中常用的命令行的参数&#xff0c;这个非常重要&#xff0c;第一我们可以通过参数了解JVM的配置&#xff0c;第二我们可以通过参数完成对JVM的调参。以及后面的JVM的调优也需要用到这些参数&#xff0c;所以我们…

轻松入门自然语言处理系列 项目3 基于Linear-CRF的医疗实体识别

文章目录 前言一、项目概况1.项目描述2.数据描述3.项目框架二、核心技术1.实体识别数据标注2.文本特征工程3.CRF模型4.BiLSTM-CRF模型三、项目实施1.读取数据2.数据标注3.文本特征工程4.模型训练5.模型评估6.BiLSTM-CRF总结前言 本文主要介绍了以Linear-CRF为基础模型进行医疗…

App 设计工具

目录 说明 打开 App 设计工具 示例 创建 App 创建自定义 UI 组件 打开现有 App 文件 打包和共享 App 本文主要讲述以交互方式创建 App。 说明 App 设计工具是一个交互式开发环境&#xff0c;用于设计 App 布局并对其行为进行编程。 可以使用 App 设计工具&#xff1a…

【黑马甄选离线数仓day05_核销主题域开发】

1. 指标分类 ​ 通过沟通调研&#xff0c;把需求进行分析、抽象和总结&#xff0c;整理成指标列表。指标有原子指标、派生指标、 衍生指标三种类型。 ​ 原子指标基于某一业务过程的度量值&#xff0c;是业务定义中不可再拆解的指标&#xff0c;原子指标的核心功能就是对指标…

Python武器库开发-前端篇之CSS元素(三十二)

前端篇之CSS元素(三十二) CSS 元素是一个网页中的 HTML 元素&#xff0c;包括标签、类和 ID。它们可以通过 CSS 选择器选中并设置样式属性&#xff0c;以使网页呈现具有吸引力和良好的可读性。常见的 HTML 元素包括 div、p、h1、h2、span 等&#xff0c;它们可以使用 CSS 设置…

值得看的书--《全宋词》节选

(https://img-blog.csdnimg.cn/5d5fe2844f6646b5b7b415f0a9e80f6c.jpg)

什么是自动化测试po模式,po分层如何实现?

一、什么是PO模式 全称&#xff1a;page object model 简称&#xff1a;POM/PO PO模式最核心的思想是分层&#xff0c;实现松耦合&#xff01;实现脚本重复使用&#xff0c;实现脚本易维护性&#xff01; 主要分三层&#xff1a; 1.基础层BasePage&#xff1a;封装一些最基…

自监督LIGHTLY SSL教程

Lightly SSL 是一个用于自监督学习的计算机视觉框架。 github链接&#xff1a;GitHub - lightly-ai/lightly: A python library for self-supervised learning on images. Documentation&#xff1a;Documentation — lightly 1.4.20 documentation 以下内容主要来自Documen…

作为Java初学者,如何快速学好Java?

作为Java初学者&#xff0c;如何快速学好Java&#xff1f; 开始的一些话 对于初学者来说&#xff0c;编程的学习曲线可能相对陡峭。这是正常现象&#xff0c;不要感到沮丧。逐步学习&#xff0c;循序渐进。 编程是一门实践性的技能&#xff0c;多写代码是提高的唯一途径。尽量…