题目:
输入正整数n和k,n>=k,找出[1,n]范围内按照字典排序的最小第k个值。
输入两个正整数n,k
输出一个整数数
实例:
输入:15,3
输出:11
题目分析:
1、首先,本题作为一个在线笔试题,有一个非常重要的问题是关注题目要求的输入输出格式。
输入:15,3 在用例测试时,需要测试很多用例,所以要使用循环接收键盘输入的格式:
while(scan.hasNext()){
//TODO
}
2、其次,输入数字以逗号(,)隔开,所以要注意将接收的字符串分割:
String str = scan.nextLine();
String[] strarr = str.split(",");
int num1 = Integer.parseInt(strarr[0]);
int num2 = Integer.parseInt(strarr[1]);
3、题意分析:
何为字典顺序?
即,若比较158 和 26,先比较第一个数字,1<2,则125<26
若比较243和257,先比较第一个数字2=2,在比较第二个数字4<5,即243<257
顺序如下:
10 ,100, 11, 12, 13, 14,15,16,17,18,19,2,20,21,22,23......
java语言实现:
import java.util.Scanner;
/**
* Created by FHY on 2019/3/17.
*/
public class Demo {
public static int lexicalOrder(int n , int k ) {
int curr = 1;
k--;
for (int i = 1; i <= n && k>0; i++) {
if (curr * 10 <= n) {
curr *= 10;
} else if (curr % 10 != 9 && curr + 1 <= n) {
curr++;
}else {
while ((curr / 10) % 10 == 9) {
curr /= 10;
}
curr = curr / 10 + 1;
}
k--;
}
return curr;
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while(scan.hasNext()){
String str = scan.nextLine();
String[] strarr = str.split(",");
int num1 = Integer.parseInt(strarr[0]);
int num2 = Integer.parseInt(strarr[1]);
System.out.println(lexicalOrder(num1, num2));
}
}
}