27. abc串

27. abc串

有一个字符串集合,所有字符串的长为 nn, 只由 'a', 'b', 'c' 三种字符组成,而且每个字符串中,所有相邻字符都是不同的。

请编写一个程序,返回这个字符串集合中,字典序第 kk 小的字符串。

样例

样例输入:

n = 3

k = 6

样例输出:

"bac"

说明

 

在样例中,长为 33 的字符串的集合如下:

["aba", "abc", "aca", "acb"

,"bab", "bac", "bca", "bcb"

."cab", "cac", "cba", "cbc"]

所以字典序第 66 小的字符串为 "bac"。

注意事项

 

1 \le n \le 10^5

1≤n≤1

0

5

.

1 \le k \le 10^{18}

1≤k≤1

0

18

.

如果所有可组成的字符串个数小于 kk,返回一个空串。

精度

public class Solution {

    /**

     * @param n: the length of the string.

     * @param k: the kth Lexicographically smallest that result should be.

     * @return: return the kth Lexicographically smallest string.

     */

    public String kthString(int n, long k) {

            long max = 3;

            int kn = 1;

            while (max < k) {

                max = max * 2;

                kn++;

            }

            if (n < kn) return "";

            int len=Math.min(n,62);

            max=max/3;  

            while(kn<len){

                max = max * 2;

                kn++;

            }

            StringBuilder result = new StringBuilder();

            char last = 'b';

            k--;

            if(n>len){

                while(n>len){

                 switch (last) {

                    case 'a':

                        last = 'b';

                        break;

                    case 'b':

                        last = 'a';

                        break;

                 }

                //  System.out.println(n+","+len);

                 result.append(last);

                 n--;

                }

            }

            

                int i = (int) (k / max);

                switch (i) {

                    case 0:

                        last = 'a';

                        break;

                    case 1:

                        last = 'b';

                        break;

                    case 2:

                        last = 'c';

                        break;

                }

                result.append(last);

                n--;

            

            





            while (n > 0) {

                int j = 0;

                if (max >= 2) {

                    k = k % max;

                    max = max / 2;

                    j = (int) (k / max);

                    // System.out.println(k+","+max+","+j);

                }

                switch (last) {

                    case 'a':

                        if (j == 0) {

                            last = 'b';

                        } else {

                            last = 'c';

                        }

                        break;

                    case 'b':

                        if (j == 0) {

                            last = 'a';

                        } else {

                            last = 'c';

                        }

                        break;

                    case 'c':

                        if (j == 0) {

                            last = 'a';

                        } else {

                            last = 'b';

                        }

                        break;

                }

                result.append(last);

                n--;

            }

            

            return result.toString();

    }

}



精度过高,越界

public String kthString(int n, long k) {

    n--;

    long max = (long) (Math.pow(2, n));

    if (max * 3 < k) return "";

    StringBuilder result = new StringBuilder();

    char last='a';

    k--;

    int i = (int) (k / max);

    switch (i) {

        case 0:

            last='a';

            break;

        case 1:

            last='b';

            break;

        case 2:

            last='c';

            break;

    }

    result.append(last);

    while (n > 0) {

        int j=0;

        if(max>=2){

            k=k%max;

            max=max/2;

            j = (int) (k / max);

        }

        //   System.out.println(k+","+max+","+j);

        switch (last) {

            case 'a':

                if (j==0){

                    last='b';

                }else {

                    last='c';

                }

                break;

            case 'b':

                if (j==0){

                    last='a';

                }else {

                    last='c';

                }

                break;

            case 'c':

                if (j==0){

                    last='a';

                }else {

                    last='b';

                }

                break;

        }

        result.append(last);

        n--;

    }

    return result.toString();

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时代我西

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值