zl程序教程

您现在的位置是:首页 >  Java

当前栏目

【Java版oj】day08两种排序方法、最小公倍数

2023-04-18 14:22:08 时间

目录

一、两种排序方法

(1)原题再现

(2)问题分析

(3)完整代码

 二、最小公倍数

(1)原题再现

(2)问题分析

(3)完整代码


一、两种排序方法

(1)原题再现

两种排序方法__牛客网

        考拉有n个字符串字符串,任意两个字符串长度都是不同的。考拉最近学习到有两种字符串的排序方法:

        1.根据字符串的字典序排序。例如:
"car" < "carriage" < "cats" < "doggies < "koala"
        2.根据字符串的长度排序。例如:
"car" < "cats" < "koala" < "doggies" < "carriage"
        考拉想知道自己的这些字符串排列顺序是否满足这两种排序方法,考拉要忙着吃树叶,所以需要你来帮忙验证。

输入描述:

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

输出描述:

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

(2)问题分析

        本题在我看来是对字符串String类型的考察,直接使用String的相关方法做是最简单的,当中需要注意的是在String类中有一个compareTo方法,内部设置直接就是按照字典序设定的。strA.compareTo(strB);返回得到一个int类型。如果字符串strA按照字典序排在字符串strB的前面,就会得到一个小于0的数;反之,如果字符串strA按照字典序排在字符串strB的后面,就会得到一个大于0的数两个字符串相等,就会得到0。如果知道这个方法,题目就会很好做,不然就得对字符串里的每一个字符逐一比较,很有可能会遗漏一些情况。

        关于String的更多相关知识指路:

Java基础之神奇String类(一)_小熊爱吃软糖吖的博客-CSDN博客

Java基础之神奇String类(二)_小熊爱吃软糖吖的博客-CSDN博客

(3)完整代码

import java.util.*;
public class Main{

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		String [] str=new String[n];
		for(int i=0;i<n;i++) {
			String s=sc.next();
			str[i]=s;
		}
		if(len(str)&&!lex(str)) {
			System.out.println("lengths");
			
		}else if(lex(str)&&!len(str)) {
			
			System.out.println("lexicographically");
		}else if(lex(str)&&len(str)) {
			
			System.out.println("both");
		}else {
			
			System.out.println("none");
		}				
	}
		
	public static boolean len(String [] str) {
		for(int i=1;i<str.length;i++) {
			if(str[i-1].length()>=str[i].length()){
				return false;
			}
		}
		return true;
	}
	public static boolean lex(String [] str) {
		for(int i=1;i<str.length;i++) {
			if(str[i-1].compareTo(str[i])>0) {
				return false;
			}
		}
		return true;	
	}		
}

 二、最小公倍数

(1)原题再现

求最小公倍数__牛客网

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

(2)问题分析

        这道题很常见,最容易想到的方式是暴力求解,利用一个for循环,从1一直到a*b,直到找出最小的公倍数。在我看来,记住公式是最快捷的方法,两个数的乘积=最大公约数*最小公倍数求解最大公约数可以用辗转相除法:两数中较大的数(max)为除数,较小的数(min)为被除数,当max%min!=0时,将min赋值给max,max除以min的余数赋值给min,直至==0时,较小的数(min)就是最大公约数。得到最大公约数就可以很容易求解最小公倍数了。

(3)完整代码

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 LCD=a*b/GCD(a,b);
		System.out.println(LCD);
		
	}
	public static int GCD(int a,int b) {//最大公约数
		int x=Math.min(a, b);
		int y=Math.max(a, b);
		while(y%x!=0) {
			int rel=y%x;
			y=x;
			x=rel;
		}
		return x;
	}
}