牛客笔试题——day08(两种排序算法+最小公倍数)

文章提供了解决两个问题的Java代码:一是验证字符串数组是否按字典序或长度排序,二是计算两个正整数的最小公倍数。通过compareTo方法比较字典序,通过length方法比较长度,使用辗转相除法求最大公约数,进而计算最小公倍数。
摘要由CSDN通过智能技术生成

一、两种排序方法

1. 题目描述

考拉有n个字符串字符串,任意两个字符串长度都是不同的。考拉最近学习到有两种字符串的排序方法: 1.根据字符串的字典序排序。例如:
“car” < “carriage” < “cats” < "doggies < “koala”
2.根据字符串的长度排序。例如:
“car” < “cats” < “koala” < “doggies” < “carriage”
考拉想知道自己的这些字符串排列顺序是否满足这两种排序方法,考拉要忙着吃树叶,所以需要你来帮忙验证。

2. 输入描述

输入第一行为字符串个数n(n ≤ 100) 接下来的n行,每行一个字符串,字符串长度均小于100,均由小写字母组成

3. 输出描述

如果这些字符串是根据字典序排列而不是根据长度排列输出"lexicographically",
如果根据长度排列而不是字典序排列输出"lengths",
如果两种方式都符合输出"both",否则输出"none"

4. 示例

输入:
3
a
aa
bbb
输出:
both

5. 题目分析

将接收的字符串都放到String数组中,利用string的compareTo方法来按ascii比较字符串字典序排序,利用string的length方法来比较字符串的长度排序

6. 解题步骤

  1. 先使用 BufferedReader 对象的 readLine() 方法读取一行文本输入,
  2. 然后使用 Integer.parseInt() 方法将这个字符串解析为一个整数,
  3. 实现两个方法:
    a.是否按字典顺序排序
    b.是否按字符串长度排序
  4. 根据题意判断并输出相应内容。

7. 代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class two_SortMethod {
    public static void main(String[] args) throws IOException {
        /*先使用 BufferedReader 对象的 readLine() 方法读取一行文本输入,
        然后使用 Integer.parseInt() 方法将这个字符串解析为一个整数。
         */
        BufferedReader re=new BufferedReader(new InputStreamReader(System.in));
        int n=Integer.parseInt(re.readLine());
        String []str=new String[n];
        for (int i = 0; i < n; i++) {
            str[i]=re.readLine();
        }
        //判断
        if(isSortZiDian(str)&&isSortLength(str)){
            System.out.println("both");
        }else if(isSortZiDian(str)){
            System.out.println("lexicographically");
        }else if(isSortLength(str)){
            System.out.println("lengths");
        }else{
            System.out.println("none");
        }
    }
    //是否按字典顺序排序
    private static boolean isSortZiDian(String[] str) {
        for (int i = 0; i < str.length-1; i++) {
            //compareTo方法返回str[i]-str[i+1],
            // str[i]-str[i+1]>0,则证明没有按照字典顺序排序
            if(str[i].compareTo(str[i+1])>0){
                return false;
            }
        }
        return true;
    }
    //是否按字符串长度排序
    private static boolean isSortLength(String[] str) {
        for (int i = 0; i < str.length-1; i++) {
            if(str[i].length()>str[i+1].length()){
                return false;
            }
        }
        return true;
    }
}

二、求最小公倍数

1. 题目描述

正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。

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

2. 输入描述

输入两个正整数A和B。

3. 输出描述

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

4. 示例

输入:
5 7
输出:
35

5. 题目分析

最小公倍数 = 两数之积除以最大公约数,这里使用碾转相除法进行最大公约数的求解:即a与b的最大公约数可以转化为a、b之间的余数为两者之间最小的数之间的公约数。所以对于输入的两个数进行连续求余,直到余数为0,求余的分母即为结果。
解题思路

6. 解题步骤

  1. 实现一个求两数的最大公约数方法:gdc();
    利用辗转相除法
    a. 先将两数的较大值选出来;
    b. 用较大的数和较小的数求余数,若余数大于零,则将较小的数赋值给较大的数,求出的余数赋值给较小的数,直至余数小于0退出while循环;
    c. 最终返回最新的较小数。
  2. 输出result=m*n/mn即为最终结果。

7. 代码

import java.util.Scanner;

public class least_Common_Multiple {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int m=sc.nextInt();
        int n=sc.nextInt();
        int mn=gdc(m,n);
        int result=m*n/mn;
        System.out.println(result);
    }

    private static int gdc(int m, int n) {
        //base case
        if(m==n){
            return m;
        }
        if(m<n){
            int temp=m;
            m=n;
            n=temp;
        }
        int r;
        while((r=m%n)>0){
            m=n;
            n=r;
        }
        return n;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值