題目:
輸入正整數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));
}
}
}