網易筆試題之:輸入正整數n和k,n>=k,找出[1,n]範圍內按照字典排序的最小第k個值。

題目:

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章