![](https://img-blog.csdnimg.cn/20190918140053667.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
JAVA 算法题合集
每日一道算法题
胖蝶的程序猿生活
悪 霊 退 散
展开
-
每日经典算法题(三十一) 逆序排列
每日经典算法题(三十一) 逆序排列逆序:Reverse Order题目将一个数组改为逆序排列。程序分析改为逆序排列即,将 {1,2,3,4} 改为 {4,3,2,1}思路要做到完全逆序,实际上就是将第一个数和最后一个数字调换,第二个数与倒数第二个数调换。具体调换方法和冒泡排序引入中间变量的方式相同。这里我们为了更加直观的查看数组的变化,可在随机生成数组之后先将数组排序输出,然后调换之后再输出看结果。代码示例public class Q31_ReverseOrderOutput_Array原创 2021-10-07 13:08:02 · 244 阅读 · 0 评论 -
每日经典算法题(三十) 插队排序
每日经典算法题(三十) 插队排序排序:Arrangement题目请预设一个已经排好序的数组。然后再输入一个数,要求按原来的规律将它插入数组中。程序分析首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移一个位置。思路预设数组,为了观察方便这里我们预设一个大小为 10 的数组 arr,和另一个大小为 11 的数组 brr。并随机生成 10 个 0-100 的数存放进 arr 中。然后利用 Arrays.sort 方法将此数组进行排序(默认从小到大)为了方便原创 2021-10-06 15:46:48 · 651 阅读 · 0 评论 -
每日经典算法题(二十九) 矩阵
每日经典算法题(二十九) 矩阵矩阵:Matrix题目求一个 3*3 矩阵对角线元素之和程序分析利用双重for循环控制输入二维数组,再将 a [i] [i] 累加后输出。思路矩阵元素其实就是 java 中的二维数组,因此我们可以定义一个 3*3 的二维数组,分别用两层 for 循环遍历输入数据。获取对角线元素,我们就获取最简单的一条对角线,即(1,1)(2,2)(3,3)这条对角线为例,三个坐标的共同点为 x 和 y 的值相等,我们可以通过 for 循环一次性累加所有的数据。若想查看结果,可原创 2021-10-06 12:38:12 · 150 阅读 · 0 评论 -
每日经典算法题(二十八) 冒泡排序
每日经典算法题(二十八) 冒泡排序冒泡排序:Bubble Sort题目任意输入 10 个数,并对这 10 个数进行从小到大的排序。程序分析对于这种数字排序问题,我们一般用冒泡排序的方法来进行排序。思路首先我们应该知道什么是冒泡排序,冒泡排序是依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。这里我们需要分别以每个数为基准和其他的数依次进行比较,所以要用双重 for 循环,外层控原创 2021-10-05 11:09:03 · 749 阅读 · 0 评论 -
每日经典算法题(二十七) 求素数
每日经典算法题(二十七) 求素数素数:Prime Number题目求100之内的素数。程序分析将 100 以内的每个正整数遍历并判断是否为素数,若为是则输出。思路具体思路在之前的 每日经典算法题(二) 分析过了,请自行查看。本题实际上是将范围变成了 0-100 ,判断的方式还是不断地除以 2 到这个数的平方根。注意要加 boolean 值判断,并在外层循环输出。代码示例public class Q27_PrimeNumbersBetween100 { public static原创 2021-10-04 16:00:51 · 121 阅读 · 0 评论 -
每日经典算法题(二十六) 分支判断(二)
每日经典算法题(二十六) 分支判断(二)周一到周日:Monday Tuesday Wednesday Thursday Friday Saturday Sunday题目请输入今天是星期几,并通过星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。程序分析简单的 if…else 分支判断即可。思路我们已知一周七天的英文(上面已给),发现第一个字母有 5 种情况,其中有 3 种(周一、周三、周五)可直接判断,周二周四和周六周日需要再进一步判断。可通过 charAt 方法原创 2021-10-04 15:42:20 · 112 阅读 · 0 评论 -
每日经典算法题(二十五) 回文数
每日经典算法题(二十五) 回文数回文数:Palindrome Number题目输入一个 5 位数,判断它是不是回文数。例:12321 是回文数,个位与万位相同,十位与千位相同。程序分析找到所谓回文数的规律并加以判断并输出结果即可。思路抛开位数不谈,回文数的普遍定义为:第一位和最后一位相等,第二位与倒数第二位相等,以此类推。那么我们在判断一个 5 位数这里就必须满足以下条件:第一位(下标 0)和第五位(下标 4)相等第二位(下标 1)和第四位(下标 3)相等若判断为 true 输出原创 2021-10-04 15:16:07 · 173 阅读 · 0 评论 -
每日经典算法题(二十四) 逆序打印
每日经典算法题(二十四) 逆序打印倒序:Reverse Order题目给一个不多于 5 位的正整数,要求:一、求它是几位数。二、逆序打印出各位数字。程序分析int 类型可以通过转换为 String 类型计算长度来获取是几位数,逆序打印则可以将 String 字符串通过 chatAt 方法打印。思路首先让用户输入想要逆序打印的数字,然后判断输入的数字是否符合不多于 5 个的条件,并输出该数的位数。判断位数我们应当将 int 转换为 String 字符串来获取 length。逆序打印的部分,我们原创 2021-10-03 12:13:42 · 163 阅读 · 0 评论 -
每日经典算法题(二十三) 年龄推算
每日经典算法题(二十三) 年龄推算今儿这题属实过于简单了题目有5个人坐在一起:问第五个人多少岁?他说比第四个人大 2 岁。问第四个人岁数,他说比第三个人大 2 岁。问第三个人,又说比第二人大 2 岁。问第二个人,说比第一个人大 2 岁。最后问第一个人,他说是 10 岁。请问第五个人多大?程序分析利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。思路找到每个人岁数之间的规律,依次小两岁,所以我们可以定义第一人原创 2021-10-02 16:55:47 · 310 阅读 · 0 评论 -
每日经典算法题(二十二) 递归算法
每日经典算法题(二十二) 递归算法递归:Recursion题目利用递归方法求 5!程序分析递归算法:绝大多数编程语言支持函数的自调用,在这些语言中函数可以通过调用自身来进行递归。思路首先可以通过 for 循环来计算,使每次乘的数加一,最后求得 n!以往的思路我们都是利用循环来计算,递归算法即在方法中调用自己来代替循环。之前我们计算阶乘时得到:n!=(n−1)!∗nn!=(n-1)!*nn!=(n−1)!∗n若我们定义一个方法来计算 n!,假设 n! 的值为 value,那么我们可以原创 2021-10-02 14:48:06 · 264 阅读 · 0 评论 -
每日经典算法题(二十一) 阶乘求和
每日经典算法题(二十一) 阶乘求和阶乘:Factorial题目求 1 + 2! + 3! + … + 20! 的和程序分析掌握阶乘元素之间的变化规律,循环累加即可。思路首先我们先要理解一个概念:n!是什么意思,他代表了 n 的阶乘,即:n!=1∗2∗3∗...∗nn! = 1 *2*3*...*nn!=1∗2∗3∗...∗n所以上面的算式即为求 1 的阶乘加到 20 的阶乘的和,根据前面阶乘的公式我们可以得到:n!=(n−1)!∗nn! = (n-1)! *nn!=(n−1)!∗原创 2021-10-01 16:51:07 · 6028 阅读 · 4 评论 -
每日经典算法题(二十) 数列求和
每日经典算法题(二十) 数列求和数列:Sequence题目有一分数数列:2/1,3/2,5/3,8/5,13/8,21/13 … 求出这个数列的前 20 项之和。程序分析请抓住分子与分母的变化规律,然后通过循环累加得出结果。思路通过观察我们可以发现,某一项的分子是上一项的分子分母之和,分母是上一项的分子。我们设第一项 x1 的 值为 a/b,则第二项 x2 的值为 (a+b)/a,通项公式为:x1=a/bx1 = a/bx1=a/bx2=(a+b)/ax2 = (a+b)/ax2原创 2021-09-30 21:30:25 · 277 阅读 · 0 评论 -
每日经典算法题(十九) 打印菱形
每日经典算法题(十九) 打印菱形菱形:Diamond题目打印出如下图案(菱形) * *** ***** ******* ***** *** *程序分析先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重 for循环,第一层控制行,第二层控制列。思路第一次看这道题的时候根本没有思路,不过偶然间一看 * 号的排列好像前几天的乘法表排列啊,只不过每一排比上一排多了两个而且起始的位置不同。我们换一种思路思考,起始的位置不同是因为什原创 2021-09-30 21:07:28 · 264 阅读 · 0 评论 -
每日经典算法题(十八) 对决名单
每日经典算法题(十八) 对决名单乒乓球:Table Tennis题目两个乒乓球队进行比赛,各出三人。甲队为 a,b,c 三人,乙队为 x,y,z 三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a 说他不和 x 比,c 说他不和 x,z 比。请编程序找出三队赛手的名单(例如:a vs x)程序分析随后输出的结果是一一对应的关系,可以将甲乙两队所有的排列组合结果都枚举出来,然后只打印输出符合条件的结果即可。思路按照常理来说,这是一道很简单的推理题,稍作分析即可得出 c 只能跟 y 比,a 又原创 2021-09-30 20:34:55 · 368 阅读 · 0 评论 -
每日经典算法题(十七) 猴子吃桃
每日经典算法题(十七) 猴子吃桃猴子:Monkey 递归算法:Recursion Algorithm题目猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少个桃子?程序分析采取逆向思维的方法,从后往前推断,列出通项公式。思路通过题干我们可以得到基本信息是若有 n 个桃子,第一天则吃了 n/2 + 1 个桃子,即剩下 n/原创 2021-09-30 20:04:35 · 2069 阅读 · 0 评论 -
每日经典算法题(十六) 九九乘法表
每日经典算法题(十六) 九九乘法表九九乘法表:Multiplication Table 99题目输出 9 * 9 口诀程序分析分行与列考虑,共9行9列,i 控制行,j 控制列思路非常经典的算法题了,二重 for 循环遍历输出,第一层控制行,第二层控制列。直接输出即可。代码示例public class Q16_MultiplicationTable99 { //题目:输出9*9口诀。 //1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列。 public s原创 2021-09-29 20:27:01 · 291 阅读 · 0 评论 -
每日经典算法题(十五) 大小排序
每日经典算法题(十五) 大小排序排序:Arrangement题目输入三个整数 x、y、z,请把这三个数由小到大输出。程序分析从三个数中分别比较某两个数,将大的数换到后面。思路由于最后的输出要从小到大,那么我们规定按照 x、y、z 的顺序即为从小到大的顺序。x 即为最小的数,所以 x 先要通过分别和 y、z 比较,将较小的数换到 x 的位置来,然后再比较 y、z 的大小,将较小的数换到 y 的位置来即可。关于比较之后的换位问题,可以引入一个中间变量 t。例如:将比较 x、y 中的 x 先赋值到原创 2021-09-28 20:25:15 · 279 阅读 · 0 评论 -
每日经典算法题(十四) 日期计数
每日经典算法题(十四) 日期计数Good Good Study,Day Day Up!题目请用户输入某年、某月、某日,判断这一天是这一年的第几天?程序分析以 3 月 5 日为例,应该先把前两个月的加起来,然后再加上 5 天即本年的第几天。特殊情况,闰年且输入月份大于 3 时需考虑多加一天。思路这道题其实除了判断闰年的程序以外有很多种思路来求解,例如:思路一:可以利用 switch…case 将月份和对应天数作为条件和结果输入,最后加上日期即为总天数。思路二:可以将每月的基本天数(平年)添原创 2021-09-28 19:48:48 · 239 阅读 · 0 评论 -
每日经典算法题(十三) 逆推算法(平方根相关)
每日经典算法题(十三) 逆推算法(平方根相关)平方根:Square Root题目有一个整数,它加上 100 后是一个 完全平方数 ,再加上 168 又是一个 完全平方数 ,请问该数是多少?程序分析首先确定这个数的限定条件,然后循环遍历判断即可。思路用数学的思路来看,可列式:a² = y + 100b² = y + 100 + 168因为 a,b 均为整数,所以 y + 100 的平方根为整数,y + 100 + 168 的平方根也为整数。由于完全平方数 >= 0,所以 y +原创 2021-09-27 20:13:23 · 433 阅读 · 0 评论 -
每日经典算法题(八) 求和算法
每日经典算法题(八) 求和算法累加:Accumulation题目需求:求 s = a + aa + aaa + aaaa + aa…a 的值,其中 a 是一个数字。例如 2 + 22 + 222 + 2222 + 22222 (此时共有 5 个数相加),几个数相加由键盘输入控制。程序分析首先找到求和元素之间的关系,然后利用循环累加结果即可。思路这个求和算法直观看起来还挺好理解的,我们先找到这些求和项之间的关系。根据表达式很容易就能看出来前一项 a1 与后一项 a2 的关系为:a2 = 10原创 2021-09-24 20:14:57 · 520 阅读 · 0 评论 -
每日经典算法题(十二) 分支判断
每日经典算法题(十二) 分支判断今天没有小英文~题目企业发放的奖金根据利润提成。利润 ( I ) 低于或等于 10 万元时,奖金可提 10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%;高于100万元时,超过100万元的部分按1%提成。从键盘输入当月利润 I,求应发原创 2021-09-26 20:31:49 · 97 阅读 · 0 评论 -
每日经典算法题(十一) 排列组合
每日经典算法题(十一) 排列组合排列组合:Permutation And Combination题目有 1、2、3、4 四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?程序分析这个三位数可填在百位、十位、个位的数字都是 1、2、3、4。组成所有的排列后,再去掉不满足条件的排列即可。思路其实最容易理解的解法就是三层 for 循环遍历所有情况,在最内层循环添加 if 判断三个数字都不相同,求出该数字并输出即可。由于最后我们还要求总数,所以在外面定义一个 count,并在判断成功以后加原创 2021-09-26 20:13:11 · 221 阅读 · 0 评论 -
每日经典算法题(十) 反弹球
每日经典算法题(十) 反弹球反弹:Rebound题目有一颗反弹球从100米高度自由落下,每次落地后反弹回原高度的一半,再落下。求:它在第 10 次落地时,共经过多少米?第 10 次反弹多高?程序分析此问题还是经典的重复动作循环的问题,只要找到增加路程和高度的变化规律就能解决。思路我们可以将路程设为 s,高度设定为 h。初始高度为 h = 100,初始路程为 s = 0,球在第一次接触地面(即第一次落地)时能反弹的高度为 h/2,路程为 s = 100。此后每次落地 h 都变为原来的原创 2021-09-26 19:54:33 · 559 阅读 · 0 评论 -
每日经典算法题(九) 完全数
每日经典算法题(九) 完全数完数(完全数):Perfect Number题目题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如:6 = 1+2+3。编程:找出 1000 以内的所有完数。程序分析基本程序还是需要通过循环来完成,由于题目限定了范围所以这里我们用 for 循环更加适合。只要理解了如何判定这个数是否为完全数就很简单了。思路首先要思考什么是完全数,即他的真因子(除这个数本身以外的约数)相加之和为这个数。所以判断的过程就指向了如何找某个数的约数,依次找出这个数的约数然后将原创 2021-09-26 19:30:36 · 293 阅读 · 0 评论 -
每日经典算法题(七) 正则表达式
每日经典算法题(七) 正则表达式正则表达式:Regular Expression题目需求:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。程序分析运用条件语句判断输入字符串中的每一个字符是否为数字/字母/空格/其他,判断条件可用正则表达式。思路基本思路就是利用 string.matches(regex) 来判断单个字符。为了结果,必须定义 4 个 int 变量用于增加计数(number、letter、blank、other)。让用户输入字符串,并获取。在进入遍历之前需要原创 2021-09-23 19:49:40 · 174 阅读 · 0 评论 -
每日经典算法题(六) 辗转相除法
每日经典算法题(六) 辗转相除法辗转相除法(欧几里得算法):Euclidean Algorithm最大公约数:Greatest Common Divisor 最小公倍数:Least Common Multiple题目需求:输入两个正整数 m 和 n,求其 最大公约数 和 最小公倍数 。程序分析经典的求最大公约数和最小公倍数问题,最适合的算法就是辗转相除法(欧几里得算法)。思路辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数。所以要在两数取余不为 0 的原创 2021-09-23 19:26:49 · 1450 阅读 · 0 评论 -
每日经典算法题(五) 三目运算符
每日经典算法题(五) 三目运算符三目条件运算符:Ternary Conditional Operator题目利用条件运算符的嵌套来完成此题:学习成绩 >= 90 分的同学用 A 表示,60-89 分之间的用 B 表示,60 分以下的用 C 表示。程序分析( a > b ) ? a : b这是三目条件运算符的基本例子。思路这题总体来说比较简单,相比冗长的 if…else 语句,利用三目运算符可以使代码更加简洁。完善:可以先让用户输入自己的成绩,然后根据输入的成绩来判断。代码示例原创 2021-09-23 18:59:11 · 905 阅读 · 0 评论 -
每日经典算法题(四) 分解质因数
每日经典算法题(四) 分解质因数分解质因数:Decomposition Quality Factor题目将一个正整数分解质因数。例如:输入 90,打印出:90 = 2 * 3 * 3 * 5程序分析若对 n 进行质因数分解,应先找到一个最小的质数 k,然后以短除法的方式继续除,除不尽再除以下一个质数。思路求解质因数的过程与短除法类似,都是从最小的质数(2)开始除,若除不尽则从第二个质数(3)开始除,依次循环判断,所以这里我们要用 while 循环来分解质因数。因为正整数范围内 1 不存在质因数原创 2021-09-22 12:47:11 · 643 阅读 · 0 评论 -
每日经典算法题(三) 求水仙花数
每日经典算法题(三) 求水仙花数水仙花数:Narcissistic Number题目打印输出所有的 “水仙花数” 。所谓 “水仙花数” 是指一个三位数,其各位数字立方和等于该数本身。例如: 153 是一个 “水仙花数” ,因为 153 = 1的三次方+5的三次方+3的三次方。水仙花数又被称为 “超完全数字不变数” ,“三位自幂数”。程序分析利用 for 循环控制 100-999 的数,并分析每个数是否为 “水仙花数”。思路整个题目的核心其实就是判断这个数是否满足水仙花数的条件,这就必须要获原创 2021-09-21 22:38:00 · 473 阅读 · 0 评论 -
每日经典算法题(二) 素数判断
每日经典算法题(二) 素数判断素数:Prime Number平方根:Square Root题目判断 101-200 之间有多少个素数,并输出在此范围内的所有素数。程序分析判断素数的方法:用一个数分别去除以 2 到这个数的平方根(sqrt)。如果能被整除,则表明此数不是素数,反之是素数。思路本题目有两个所求的目标,一为 101-200 之内的素数个数,二为输出所有素数。因此必需获取的变量为素数个数,这里设定为 int sum。根据分析,我们需要用到循环来进行除法运算,此外由于数量大,外层原创 2021-09-21 22:18:27 · 218 阅读 · 0 评论 -
每日经典算法题(一) 不死神兔(斐波那契数列/递归算法)
每日经典算法题(一) 不死神兔(斐波那契数列/递归算法)(每次看到这兔子问题都会联想到 Re0 的大兔 ~ 不寒而栗,唉我的蕾姆)题目古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?程序分析因为兔子能生育以后每个月都会继续生兔子,因此从第三个月开始兔子数为前两个月兔子数之和。即兔子的数量规律为:1,1,2,3,5,8,13,21,44,65…我们这里为了方便测验将时间限定为 15 个月。思路创建原创 2021-09-21 21:52:26 · 532 阅读 · 0 评论