我们知道,整数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]中的所有整数进行排序。现在,如果两个或多个整数具有相同的幂值,请按升序对它们进行排序。我们必须找到按幂值排序的[lo,hi]范围内的第k个整数。
例如,如果输入像lo = 12,hi = 15且k = 2,则输出将为13。这是因为12的幂为9,13的幂为9,而14的幂为17。对于15,它也是17,所以排序后的序列是[12,13,14,15],并且当k = 2时,元素是13。
为了解决这个问题,我们将遵循以下步骤-
定义getTurn方法,它将以n作为输入
ret:= 0
当n不是1时
如果n为奇数,则n:= n * 3 +1,否则n:= n / 2
增加ret 1
从主要方法
因为我在范围内
配对(getTurn(i),i)
将温度插入ret
根据能力对对排序,否则按升序排序
返回对ret [k-1]对的第二个值
让我们看下面的实现以更好地理解-
#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