【算法刷题日记之本手篇】两种排序方法与求最小公倍数

举报
未见花闻 发表于 2022/07/31 22:26:32 2022/07/31
【摘要】 本篇文章介绍来自牛客试题广场的两道题题解,分别为【两种排序方法】和【求最小公倍数】,展示语言java。

⭐️前面的话⭐️

本篇文章介绍来自牛客试题广场的两道题题解,分别为【两种排序方法】和【求最小公倍数】,展示语言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的最小公倍数。

数据范围: 1 a , b 100000 1≤a,b≤100000

输入描述:

输入两个正整数A和B。

输出描述:

输出A和B的最小公倍数。

示例1

输入:

5 7

输出:

35

示例2

输入:

2 4

输出:

4

题目链接:求最小公倍数

💡解题思路

基本思路: 辗转相除法
解题思路:
第一步,求两数的最大公约数maxDiv
利用辗转相除法,求的ab的最大公约数,加设a=48b=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
最小公倍数与最大公约数有以下关系,不妨设ab两数的最大公约数为maxDiv,最小公倍数为minMul,则满足:

m i n M u l = a b / m a x D i v minMul=a * b / maxDiv

我们利用这个关系式子就能够求出最小公倍数了。

🔑源代码

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);
    }
}

🌱总结

本题为辗转相除法运用题,本质上是一个数学问题。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。