【算法刷题日记之本手篇】两种排序方法与求最小公倍数
⭐️前面的话⭐️
本篇文章介绍来自牛客试题广场的两道题题解,分别为【两种排序方法】和【求最小公倍数】,展示语言java。
📒博客主页:未见花闻的博客主页
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📌本文由未见花闻原创!
📆首发时间:🌴2022年7月31日🌴
✉️坚持和努力一定能换来诗与远方!
💭推荐书籍:📚《数据结构与算法》,📚《算法导论》
💬参考在线编程网站:🌐牛客网🌐力扣
博主的码云gitee,平常博主写的程序代码都在里面。
博主的github,平常博主写的程序代码都在里面。
🍭作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!
⭐️两种排序方法⭐️
🔐题目详情
考拉有n个字符串字符串,任意两个字符串长度都是不同的。考拉最近学习到有两种字符串的排序方法: 1.根据字符串的字典序排序。例如:
“car” < “carriage” < “cats” < "doggies < “koala”
2.根据字符串的长度排序。例如:
“car” < “cats” < “koala” < “doggies” < “carriage”
考拉想知道自己的这些字符串排列顺序是否满足这两种排序方法,考拉要忙着吃树叶,所以需要你来帮忙验证。
输入描述:
输入第一行为字符串个数n(n ≤ 100) 接下来的n行,每行一个字符串,字符串长度均小于100,均由小写字母组成
输出描述:
如果这些字符串是根据字典序排列而不是根据长度排列输出"lexicographically",
如果根据长度排列而不是字典序排列输出"lengths",
如果两种方式都符合输出"both",否则输出"none"
示例1
输入:
3
a
aa
bbb
输出:
both
题目来源:两种排序方法
💡解题思路
基本思路: 验证排序顺序
解题思路:
其实解决思路很简单,就是去验证字符串数组是否满足字典排序和是否满足按照长度排序。
我们可以设计两个方法分别用于验证字典排序与长度排序,最后在根据两个方法的验证结果,去输出题目所要求输出的字符串。
有关验证字典排序的细节:对于验证字典排序,我们可以遍历相邻的两个字符串,看后面的那个字符串的字典顺序是否排在前面那个字符串的后面,如果没有直接返回false
,遍历完全部字符串数组,则返回true
,对于两个字符串字典顺序我们可以使用compareTo
方法来判断。
有关按照长度排序的细节:相比于验证字典序,思路是一模一样的,唯一的区别是比较相邻字符串顺序的方式不一样,这里比较相邻字符串长度作为依据即可。
🔑源代码
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException{
//Scanner用腻了,这次使用流
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String[] strs = new String[n];
for (int i = 0; i < n; i++) {
strs[i] = br.readLine();
}
//判断
boolean islen = isLen(strs);
boolean islex = isLex(strs);
if (islex && islen) {
System.out.println("both");
} else if (!islex && islen) {
System.out.println("lengths");
} else if (islex && !islen) {
System.out.println("lexicographically");
} else {
System.out.println("none");
}
}
private static boolean isLex(String[] s) {
for (int i = 0; i < s.length - 1; i++) {
//判断相邻两个字符串是否以字典序排列
if (s[i].compareTo(s[i+1]) > 0) {
return false;
}
}
return true;
}
private static boolean isLen(String[] s) {
for (int i = 0; i < s.length - 1; i++) {
//判断相邻两个字符串是否以长度序排列
if (s[i].length() - s[i+1].length() > 0) {
return false;
}
}
return true;
}
}
🌱总结
本题为简单模拟验证题,重点在于使用compareTo
方法进行字典序验证,length
方法进行长度顺序验证。
⭐️求最小公倍数⭐️
🔐题目详情
正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。
数据范围:
输入描述:
输入两个正整数A和B。
输出描述:
输出A和B的最小公倍数。
示例1
输入:
5 7
输出:
35
示例2
输入:
2 4
输出:
4
题目链接:求最小公倍数
💡解题思路
基本思路: 辗转相除法
解题思路:
第一步,求两数的最大公约数maxDiv
。
利用辗转相除法,求的a
与b
的最大公约数,加设a=48
,b=128
辗转相除法步骤如下:
序号 | a=b | a%b | b=a % b |
---|---|---|---|
1 | 128 | 48 | 48 |
2 | 48 | 32 | 32 |
3 | 32 | 16 | 16 |
4 | 16 | 0 | 0 |
当a%b==0
时,此时的a
就是最大公约数。
第二步,求a
b
两数的最小公倍数minMul
。
最小公倍数与最大公约数有以下关系,不妨设a
与b
两数的最大公约数为maxDiv
,最小公倍数为minMul
,则满足:
我们利用这个关系式子就能够求出最小公倍数了。
🔑源代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
//第一步,辗转相除法求最大公约数
int m = a;
int n = b;
while (m % n != 0) {
int tmp = m;
m = n;
n = tmp % n;
}
int maxDiv = n;
//第二步,最小公倍数等于a * b / maxDiv
int minMul = a * b / maxDiv;
System.out.println(minMul);
}
}
🌱总结
本题为辗转相除法运用题,本质上是一个数学问题。
- 点赞
- 收藏
- 关注作者
评论(0)