一、两种排序方法
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. 解题步骤
- 先使用 BufferedReader 对象的 readLine() 方法读取一行文本输入,
- 然后使用 Integer.parseInt() 方法将这个字符串解析为一个整数,
- 实现两个方法:
a.是否按字典顺序排序
b.是否按字符串长度排序 - 根据题意判断并输出相应内容。
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. 解题步骤
- 实现一个求两数的最大公约数方法:gdc();
利用辗转相除法
a. 先将两数的较大值选出来;
b. 用较大的数和较小的数求余数,若余数大于零,则将较小的数赋值给较大的数,求出的余数赋值给较小的数,直至余数小于0退出while循环;
c. 最终返回最新的较小数。 - 输出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;
}
}