Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

K-th เล็กที่สุดในลำดับพจนานุกรมในภาษา C++


สมมติว่าเรามีสองค่า n และ k เราต้องหาจำนวนเต็มที่น้อยที่สุดที่ kth เกี่ยวกับคำศัพท์ในช่วง 1 ถึง n ดังนั้นหากอินพุตเป็น n =14 และ k =3 เอาต์พุตจะเป็น 11 เนื่องจากลำดับจะเป็น [1, 10, 11, 12, 13, 14, 2, 3, 4, 5, 6, 7 , 8, 9] แล้วเลข k คือ 11

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • กำหนดฟังก์ชัน findKthNumber() ซึ่งจะใช้เวลา n, k,
  • สกุลเงิน :=1
  • (ลดลง k โดย 1)
  • ในขณะที่ k ไม่ใช่ศูนย์ ให้ทำ −
    • ขั้นตอน :=เรียกใช้ฟังก์ชัน calcSteps(n, curr, curr + 1)
    • ถ้าขั้นตอน <=k แล้ว −
      • k :=k - ขั้นตอน
      • (เพิ่มสกุลเงินขึ้น 1)
    • มิฉะนั้น
      • curr :=สกุลเงิน * 10
      • k :=k - 1
    • คืนสกุลเงิน
  • กำหนดฟังก์ชัน calcSteps() ซึ่งจะใช้ nax, n1, n2,
  • ret :=0
  • ในขณะที่ n1 <=nax ทำ −
    • ret :=ret + nax ขั้นต่ำ + 1 และ n2 – n1
    • n1 :=n1 * 10
    • n2 :=n2 * 10
  • คืนสินค้า

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
class Solution {
public:
   int findKthNumber(int n, int k) {
      int curr = 1;
      k--;
      while(k){
         int steps = calcSteps(n, curr, curr + 1);
         if(steps <= k){
            k -= steps;
            curr++;
         }else{
            curr *= 10;
            k -= 1;
         }
      }
      return curr;
   }
   int calcSteps(lli nax, lli n1, lli n2){
      int ret = 0;
      while(n1 <= nax){
         ret += min(nax + 1, n2) - n1;
         n1 *= 10;
         n2 *= 10;
      }
      return ret;
   }
};
main(){
   Solution ob;
   cout << (ob.findKthNumber(14,3));
}

อินพุต

14,3

ผลลัพธ์

11