活跃农民
- 积分
- 474
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2016-2-2
- 最后登录
- 1970-1-1
|
本帖最后由 madrid 于 2021-6-6 07:49 编辑
替楼主惋惜。祝拿到大offer。
我也是follow楼主的思路,写了以下的代码供大家参- public int kth(int n, int k) {
- k += 1;
- int numOfBitOne = 0;
- while (numOfBitOne <= n) {
- int cnt = nCr(n, numOfBitOne);
- if (k <= cnt) break;
- k -= cnt;
- ++numOfBitOne;
- }
- int num = 0;
- while (n > 0) {
- // Number of corresponding numbers which have numberOfBitOne 1s when most significant bit is set to 0
- int msb0 = (n - 1 >= numOfBitOne) ? nCr(n - 1, numOfBitOne) : 0;
- if (k <= msb0)
- num = num * 2;
- else {
- k -= msb0;
- num = num * 2 + 1;
- --numOfBitOne;
- }
- --n;
- }
- return num;
- }
- private int nCr(int n, int r) {
- return factorial(n) / factorial(r) / factorial(n - r);
- }
-
- // We can use a HashMap to store the n -> n! to avoid duplicate calculations.
- private int factorial(int n) {
- if (n == 0 || n == 1) return 1;
- return n * factorial(n - 1);
- }
复制代码
Test code:- public static void main(String[] args) {
- KthNumberOf1s o = new KthNumberOf1s();
- System.out.println(o.kth(3, 4) == 3);
- System.out.println(o.kth(4, 5) == 3);
- System.out.println(o.kth(4, 6) == 5);
- System.out.println(o.kth(4, 7) == 6);
- System.out.println(o.kth(4, 8) == 9);
- }
复制代码
|
|