数字与数学——常见面试算法题
目录
数字统计问题
符号统计
阶乘0的个数
溢出问题
整数反转
回文数
进制问题
七进制数
进制转换
数组实现加法
数组实现整数加法
字符串实现加法
二进制加法
幂运算
求2的幂
求3的幂
求4的幂
辗转相除法(之前博客有过详细推导) https://blog.csdn.net/qq_74092815/article/details/130471544?spm=1001.2014.3001.5502
素数和合数(之前博客有过详细推导) https://blog.csdn.net/qq_74092815/article/details/130464087?spm=1001.2014.3001.5502
埃氏筛(之前博客有过详细推导)https://blog.csdn.net/qq_74092815/article/details/130464087?spm=1001.2014.3001.5502
丑数
在算法中,一般只会选择各个学科的基础问题来考察,例如素数问题、幂、对数、阶乘、幂运算、初等数论、几何问题、组合数学等等。
数字统计问题
符号统计
给定一个数组,求所有元素的乘积的符号,如果最终答案是负的返回-1,如果最终答案是正的返回1,如果答案是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;
}
阶乘0的个数
算出 n 阶乘有多少个尾随零。
-
求n能拆分出多少个5【统计有多少个 0,实际上是统计 2 和 5 一起出现多少对,不过因为 2 出现的次数一定大于 5 出现的次数,因此我们只需要检查 5 出现的次数就好了】
public int trailingZeroes(int n) {int cnt = 0;for (long num = 5; n / num > 0; num *= 5) {cnt += n / num;}return cnt;
}
溢出问题
整数反转
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1] ,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。
-
核心点就俩,一是反转,二是溢出判断
-
反转--->取模
-
溢出,32位最大整数是MAX=2147483647,如果一个整数num>MAX,那么应该有以下规律:nums/10 >MAX/10=214748364
public int reverse(int x) {int res = 0;while(x!=0) {//获得末尾数字int tmp = x%10;//判断是否大于最大32位整数,也可以使用Integer.MAX_VALUE/10来代替214748364if (res>Integer.MAX_VALUE/10 || (res==Integer.MAX_VALUE/10 && tmp>7)) {return 0;}//判断是否小于最小的32位整数if (res<-214748364 || (res==-214748364 && tmp<-8)) {return 0;}res = res*10 + tmp;x /= 10;}return res;
}
回文数
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
-
只反转 int 数字的一半【当反转数的位数超过或等于剩余 x 的位数时,循环终止。此时反转数已经处理了原数字的后半部分,而剩余 x 是前半部分。】
public boolean isPalindrome(int x) {// 特殊情况:// 如上所述,当 x < 0 时,x 不是回文数。// 同样地,如果数字的最后一位是 0,为了使该数字为回文,// 则其第一位数字也应该是 0// 只有 0 满足这一属性if (x < 0 || (x % 10 == 0 && x != 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;
}
进制问题
七进制数
给定一个整数 num,将其转化为 7 进制,并以字符串形式输出。其中-10^7 <= num <= 10^7。
public String convertToBase7(int num) {StringBuilder sb = new StringBuilder();//先拿到正负号boolean sign = num < 0;//这样预处理一下,后面都按照正数处理num就行了if(sign)num *= -1;//循环取余和整除 do{sb.append(num%7 + "");num/=7;}while(num > 0);//添加符号if(sign)sb.append("-");//上面的结果是逐个在末尾加的,需要反过来 return sb.reverse().toString();
}
进制转换
十进制数M,以及需要转换的进制数N,将十进制数M转化为N进制数。M是32位整数,2<=N<=16。
-
定义大小为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) {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();
}
}
数组实现加法
数组实现整数加法
由整数组成的非空数组所表示的非负整数,在其基础上加一。这里最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。并且假设除了整数 0 之外,这个整数不会以零开头。
-
进位
-
逼至首位【长度加1 如999 99 这种的结果是首位为1,其余位为0】
-
普通进位
-
-
不进位
public static int[] plusOne(int[] digits) {int len = digits.length;for (int i = len - 1; i >= 0; i--) {digits[i]++;digits[i] %= 10;if (digits[i] != 0)return digits;}// 比较巧妙的设计digits = new int[len + 1];digits[0] = 1;return digits;}
字符串实现加法
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。
public String addStrings(String num1, String num2) {int i = num1.length() - 1, j = num2.length() - 1, add = 0;StringBuffer ans = new StringBuffer();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 result = x + y + add;ans.append(result % 10);add = result / 10;i--;j--;}// 计算完以后的答案需要翻转过来ans.reverse();return ans.toString();}
二进制加法
给你两个二进制字符串,这个字符串是用数组保存的,返回它们的和(用二进制表示)。其中输入为 非空 字符串且只包含数字 1 和 0。
示例1:
输入: a = "11", b = "1"
输出: "100"
示例2:
输入: a = "1010", b = "1011"
输出: "10101"
public String addBinary(String a, String b) {StringBuilder ans = new StringBuilder();int ca = 0;for(int i = a.length() - 1, j = b.length() - 1;i >= 0 || j >= 0; i--, j--) {int sum = ca;sum += i >= 0 ? a.charAt(i) - '0' : 0;sum += j >= 0 ? b.charAt(j) - '0' : 0;ans.append(sum % 2);ca = sum / 2;}ans.append(ca == 1 ? ca : "");return ans.reverse().toString();}
幂运算
求2的幂
给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。
boolean isPowerOfTwo(int n) {if (n <= 0) {return false;}while (n % 2 == 0) {n /= 2;}return n == 1;
}
-
位运算:正整数 n 是2 的幂,当且仅当 n 的二进制表示中只有最高位是 1,其余位都是 0,此时满足 n & (n−1)=0。
public boolean isPowerOfTwo(int n) {return n > 0 && (n & (n - 1)) == 0;
}
求3的幂
给定一个整数,写一个函数来判断它是否是 3 的幂次方。如果是,返回 true ;否则,返回 false 。整数 n 是 3 的幂次方需满足:存在整数 x 使得 n == 3^x
public boolean isPowerOfThree(int n) {if (n <= 0) {return false;}while (n % 3 == 0) {n /= 3;}return n == 1;}
-
在int 型的数据范围内存在最大的 3 的幂,不超过 2^31-1 的最大的 3 的幂是 3^19=1162261467。所以如果在1~ 2^31-1内的数,如果是3的幂,则一定是1162261467的除数
public boolean isPowerOfThree(int n) {return n > 0 && 1162261467 % n == 0;}
求4的幂
boolean isPowerOfFour(int n) {if (n <= 0)return false;while (n % 4 == 0)n /= 4;return n == 1;
}
辗转相除法(之前博客有过详细推导)
public static int gcd(int a,int b){ while(b>0){ int temp = a%b; a=b; b=temp; } return a;
}public static int gcd(int a,int b){ return b==0?a:gcd(b,a%b);
}
素数和合数(之前博客有过详细推导)
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;
}
埃氏筛(之前博客有过详细推导)
public int countPrimes(int n) {int[] isPrime = new int[n];Arrays.fill(isPrime, 1);int ans = 0;for (int i = 2; i < n; ++i) {if (isPrime[i] == 1) {ans += 1;if ((long) i * i < n) {for (int j = i * i; j < n; j += i) {isPrime[j] = 0;}}}}return ans;}
丑数
只包含质因子 2、3 和 5 的数称作丑数(Ugly Number),求按从小到大的顺序的第 n 个丑数。
public boolean isUgly(int n) {if (n <= 0) {return false;}int[] factors = {2, 3, 5};for (int factor : factors) {while (n % factor == 0) {n /= factor;}}return n == 1;}
public class Solution {public int nthUglyNumber(int n) {int[] dp = new int[n];dp[0] = 1;int p2 = 0, p3 = 0, p5 = 0;for (int i = 1; i < n; i++) {int next2 = dp[p2] * 2;int next3 = dp[p3] * 3;int next5 = dp[p5] * 5;int minVal = Math.min(next2, Math.min(next3, next5));dp[i] = minVal;if (next2 == minVal) p2++;if (next3 == minVal) p3++;if (next5 == minVal) p5++;}return dp[n - 1];}
}
相关文章:
数字与数学——常见面试算法题
目录 数字统计问题 符号统计 阶乘0的个数 溢出问题 整数反转 回文数 进制问题 七进制数 进制转换 数组实现加法 数组实现整数加法 字符串实现加法 二进制加法 幂运算 求2的幂 求3的幂 求4的幂 辗转相除法(之前博客有过详细推导) https…...
Lua:第1-4部分 语言基础
1 Lua语言入门 1.1 程序段 我们将 Lua 语言执行的每一段代码(例如,一个文件或交互模式下的一行)称为一个程序段 ( Chunk ) ,即一组命令或表达式组成的序列 。 1.2 一些词法规范 Lua 语言中的标识符&#…...
2024版idea使用Lombok时报找不到符号
今天在springboot项目中使用Lombok的Builder注解,启动时居然报了找不到符号的错,如下图 于是开始了漫长的寻找之路,首先去settings->Plugins中看自己的Lombok插件是否启动,发现确实是如此,然后看网上的教程去加上这…...
python中的sort使用
目录 sort()使用 排序处理 升序由小到大排序: sort与sorted 总结 降序由大到小排序: key 参数详解 按字符串长度升序排序 按字符串第二个字符排序 sort()使用 list.sort(keyNone, reverseFalse) 功能:对列表原地排序(直接…...
构建macOS命令速查手册:基于Flask的轻量级Web应用实践
构建macOS命令速查手册:基于Flask的轻量级Web应用实践 一、项目概述 本文介绍一个基于Flask框架开发的macOS命令速查Web应用。该应用通过结构化的命令数据存储和响应式前端设计,为用户提供便捷的命令查询体验,具备以下特点: 六…...
APP的兼容性测试+bug定位方法
兼容性问题定位 一、为什么会有兼容性问题?二、APP兼容性测试场景三、常见的一些兼容性bug0. 引言1. 常见兼容性bug(1)界面性问题(2)内存不足(3)网络问题(4)权限问题 通过…...
开源 PDF.js 文件编辑操作
一、PDF.js PDF.js 是 Mozilla 基金会推出的一个使用 HTML5 构建的 PDF 阅读器,它完全使用 JavaScript 编写。作为 Firefox 浏览器的默认 PDF 查看器,PDF.js 具有强大的兼容性和稳定性。它不仅支持 PDF 文件的查看和渲染,还提供了丰富的交互…...
云资源合规基线:确保云环境安全与合规的完整指南
1. 引言 随着越来越多的企业将其IT基础设施迁移到云端,确保云资源的安全性和合规性变得至关重要。云资源合规基线是一套最佳实践和标准,旨在帮助组织维护安全、高效且符合法规要求的云环境。本文将深入探讨云资源合规基线的各个方面,为IT管理者和安全专业人士提供全面的指导。…...
#SVA语法滴水穿石# (005)关于 问号表达式(condition ? expr1 : expr2)
在 SystemVerilog 断言(SVA)中,问号表达式(condition ? expr1 : expr2)的语法和逻辑与 C 语言的三元条件运算符完全一致。它根据条件选择执行 expr1 或 expr2,常用于动态选择信号、序列或属性。 1. 基本语法 // 格式: condition ? true_expression : false_expressi…...
操作系统、虚拟化技术与云原生及云原生AI简述
目录 操作系统基础 操作系统定义 操作系统的组成 操作系统的分类 Linux操作系统特性 虚拟化技术 概述 CPU虚拟化 内存虚拟化 I/O虚拟化 虚拟化技术 虚拟化平台管理工具 容器 容器与云原生:详细介绍 容器的特点 什么是云原生? 云原生的特点 容器与云原生的…...
springcouldalibaba5大组件
springcouldalibaba5大组件 Spring Cloud Alibaba 简介 Spring Cloud Alibaba 是阿里巴巴提供的一站式微服务解决方案,基于 Spring Cloud 框架,集成了阿里巴巴的分布式中间件技术。它通过简单的注解和少量配置,就能将 Spring Cloud 应用连接…...
opencv中mat深拷贝和浅拷贝
1. 浅拷贝(Shallow Copy) 特点: 共享数据内存,新对象和原对象指向同一块内存数据。 修改任一对象的数据会影响另一个对象(因为内存共享)。 高效(仅复制矩阵头信息,不复制实际数据&…...
深入理解 C++ 三大特性之一 继承
欢迎来到干货小仓库!!! 今日的Commit 是明日的 Releasse,用持续交付的心态活成终身迭代的版本。 1.继承的定义 1.1定义格式 1.2继承关系和访问限定符 1.3继承基类成员访问方式的变化 类成员/继承方式public继承protected继承private继承基类的public成员派生类的…...
类 和 对象 的介绍
对象的本质是一种新的数据类型。类是一个模型,对象是类的一个具体化实例。为类创建实例也就是创建对象。 一、类(class) 类决定一个对象将是什么样的(有什么属性、功能)。类和变量一样,有名字。 1.创建类 …...
`use_tempaddr` 和 `temp_valid_lft ` 和 `temp_prefered_lft ` 笔记250405
use_tempaddr 和 temp_valid_lft 和 temp_prefered_lft 笔记250405 以下是 Linux 系统中与 IPv6 临时隐私地址相关的三个关键参数 use_tempaddr、temp_valid_lft 和 temp_prefered_lft 的详细说明及协作关系: 📜 参数定义与功能 参数作用默认值依赖关…...
LeetCode详解之如何一步步优化到最佳解法:20. 有效的括号
LeetCode详解系列的总目录(持续更新中): LeetCode详解之如何一步步优化到最佳解法:前100题目录(更新中...)-CSDN博客 LeetCode详解系列的上一题链接: LeetCode详解之如何一步步优化到最佳解法…...
学习笔记,DbContext context 对象是保存了所有用户对象吗
DbContext 并不会将所有用户对象保存在内存中: DbContext 是 Entity Framework Core (EF Core) 的数据库上下文,它是一个数据库访问的抽象层它实际上是与数据库的一个连接会话,而不是数据的内存缓存当您通过 _context.Users 查询数据时&…...
【2020】【论文笔记】基于二维光子晶体的光控分光比可调Y——
前言 类型 太赫兹 + 分束器 太赫兹 + 分束器 太赫兹+分束器 期刊 红外与毫米波学报 红外与毫米波学报 红外与毫米波学报 作者 姜宗丹 , 李培丽 ,...
Mydumper备份数据库
介绍: MyDumper是一个MySQL逻辑备份工具。它有2个工具: mydumper负责导出 MySQL 数据库的一致备份myloader从 mydumper 读取备份,连接到目标数据库并导入备份。 这两个工具都使用多线程功能。 下载链接: https://github.com/m…...
BN测试和训练时有什么不同, 在测试时怎么使用?
我们来彻底搞懂 Batch Normalization(BN) 在训练和测试阶段的区别,以及 测试时怎么用。 🧠 一句话总结: 训练时:使用 当前 mini-batch 的均值和方差 测试时:使用 整个训练集估计的“滑动平均均值…...
JavaWeb 课堂笔记 —— 02 JavaScript
本系列为笔者学习JavaWeb的课堂笔记,视频资源为B站黑马程序员出品的《黑马程序员JavaWeb开发教程,实现javaweb企业开发全流程(涵盖SpringMyBatisSpringMVCSpringBoot等)》,章节分布参考视频教程,为同样学习…...
多GPU训练
写在前面 限于财力不足,本机上只有一个 GPU 可供使用,因此这部分的代码只能够稍作了解,能够使用的 GPU 也只有一个。 多 GPU 的数据并行:有几张卡,对一个小批量数据,有几张卡就分成几块,每个 …...
Java面试黄金宝典33
1. 什么是存取控制、 触发器、 存储过程 、 游标 存取控制 定义:存取控制是数据库管理系统(DBMS)为保障数据安全性与完整性,对不同用户访问数据库对象(如表、视图等)的权限加以管理的机制。它借助定义用户…...
如何在 Linux 上安装 Python
本指南介绍如何在Linux机器上安装 Python。Python 已成为开发人员、数据科学家和系统管理员必不可少的编程语言。它用于各种应用,包括 Web 开发、数据科学、自动化和机器学习。 本综合指南将引导您完成在 Linux 系统上安装Python的过程,涵盖从基本包管理…...
系统与网络安全------Windows系统安全(6)
资料整理于网络资料、书本资料、AI,仅供个人学习参考。 共享文件夹 发布共享文件夹 Windows共享概述 微软公司推出的网络文件/打印机服务系统 可以将一台主机的资源发布给其他主机共有 共享访问的优点 方便、快捷相比光盘 U盘不易受文件大小限制 可以实现访问…...
解决 Spring Boot 返回日期格式问题
springboot项目有个属性这样注解 DateTimeFormat(pattern "yyyy-MM-dd") private Date createTime; 表中是 create_time datetime DEFAULT NULL 只使用了 DateTimeFormat 注解来处理输入格式,但没有配置输出格式。返回给前端还是 createTime: "2…...
复古千禧Y2风格霓虹发光酸性镀铬金属短片音乐视频文字标题动画AE/PR模板
踏入时光机,重温 21 世纪初大胆、未来主义和超光彩的美学!这是一个动态的 After Effects 模板,旨在重现千禧年的标志性视觉效果——铬反射、霓虹灯发光、闪亮的金属和流畅的动态图形。无论您是在制作时尚宣传片、怀旧音乐视频还是时尚的社交媒…...
linux 安装 mysql记录
sudo apt-get install mysql-server 一直报错,按照下面的终于安装出来了 这个链接 https://cn.linux-console.net/?p13784 第 1 步:要删除 MySQL 及其所有依赖项,请执行以下命令: sudo apt-get remove --purge mysql* 第 2 步…...
如何设计一个本地缓存
想获取更多高质量的Java技术文章?欢迎访问Java技术小馆官网,持续更新优质内容,助力技术成长 Java技术小馆官网https://www.yuque.com/jtostring 如何设计一个本地缓存 随着系统的复杂性和数据量的增加,如何快速响应用户请求、减…...
NLP/大模型八股专栏结构解析
1.transformer 结构相关 (1)transformer的基本结构有哪些,分别的作用是什么,代码实现。 NLP高频面试题(一)——Transformer的基本结构、作用和代码实现 (2)LSTM、GRU和Transformer结…...
