在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]中的所有整数进行排序。现在,如果两个或多个整数具有相同的幂值,请按升序对它们进行排序。我们必须找到按幂值排序的[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
增加ret1
从主要方法
因为我在范围内
配对(getTurn(i),i)
将温度插入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