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

จัดเรียงจำนวนเต็มตามค่ากำลังใน C++


อย่างที่เราทราบดีว่ากำลังของจำนวนเต็ม x ถูกกำหนดให้เป็นจำนวนขั้นตอนที่จำเป็นในการแปลง x เป็น 1 โดยใช้ขั้นตอนต่อไปนี้ -

  • ถ้า x เป็นคู่ x =x / 2

  • ถ้า x เป็นเลขคี่ x =3 * x + 1

ตัวอย่างเช่น พลังของ x =3 คือ 7 เพราะ 3 ใช้ 7 ขั้นตอนกลายเป็น 1 (3 → 10 → 5 → 16 → 8 → 4 → 2 → 1) ถ้าเรามีจำนวนเต็ม lo, hi และ k เราต้องจัดเรียงจำนวนเต็มทั้งหมดในช่วงเวลา [lo, hi] โดยค่ากำลังในการเรียงลำดับจากน้อยไปมาก ตอนนี้ ถ้าจำนวนเต็มตั้งแต่สองตัวขึ้นไปมีค่ากำลังเท่ากัน ให้เรียงลำดับจากน้อยไปหามาก เราต้องหาจำนวนเต็มที่ k ในช่วง [lo, hi] เรียงตามค่ากำลัง

ตัวอย่างเช่น หากอินพุตเป็น lo =12, hi =15 และ k =2 ดังนั้นเอาต์พุตจะเป็น 13 เนื่องจากกำลังของ 12 คือ 9, กำลังของ 13 คือ 9 สำหรับ 14 นี่คือ 17 และสำหรับ 15 มันก็เป็น 17 ด้วย ดังนั้นลำดับการจัดเรียงคือ [12,13,14,15] และเมื่อ k =2 ดังนั้นองค์ประกอบคือ 13

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

  • กำหนดเมธอด getTurn ซึ่งจะใช้ n เป็นอินพุต

  • ยกเลิก :=0

  • ในขณะที่ n ไม่ใช่ 1

    • ถ้า n เป็นเลขคี่ ดังนั้น n :=n * 3 + 1 มิฉะนั้น n :=n / 2

    • เพิ่มขึ้น 1

  • จากวิธีหลัก

  • เพราะฉันอยู่ในช่วง lo ถึง hi

    • สร้างคู่ (getTurn(i), i)

    • ใส่ temp ลงใน ret

  • เรียงคู่ตามกำลัง หรือเรียงลำดับจากน้อยไปมาก

  • ส่งคืนค่าที่สองของคู่ ret[k - 1]

ตัวอย่าง (C++)

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   vector < pair <int, int> > ret;
   static bool cmp(pair <int, int>& a, pair <int, int>& b){
      return a.first == b.first ? a.second < b.second : a.first < b.first;
   }
   int getTurn(int n){
      int ret = 0;
      while(n != 1){
         if(n & 1){
            n = n * 3 + 1;
         }
         else n >>= 1;
            ret ++;
      }
      return ret;
   }
   int getKth(int lo, int hi, int k) {
      for(int i = lo; i <= hi; i++){
         pair <int, int> temp;
         temp.first = getTurn(i);
         temp.second = i;
         ret.push_back(temp);
      }
      sort(ret.begin(), ret.end(), cmp);
      return ret[k - 1].second;
   }
};
main(){
   Solution ob;
   cout << (ob.getKth(12, 15, 2));
}

อินพุต

12
15
2

ผลลัพธ์

13