获取解码字符串指定位置的数值 Decoded String at Index

2018-10-04 12:53:06

问题描述:

问题求解:

首先本题给出了问题的规模,从Note中我们可以看到解码后的字符串长度甚至可以达到2^63的长度,这个长度已经远远超过整型数的范围,因此如果只是先解码后提取的话无疑是会超时的。

那么本题还有什么别的思路呢?正常来说如果碰到这种重复循环的问题,首先想到的自然是取余操作,比如hahahaha,K = 5,其实和 (K % 2 = 1)是一样的,因此本题的解法就很明确了,就是每次对K进行取余操作,如果说碰到了K == size的情况,也就是说当前的字符扩展后正好长度为K,那么直接返回这个字符即可(当然首先需要判断是否为字母)。

    public String decodeAtIndex(String S, int K) {
        long size = 0;
        int N = S.length();
        for (int i = 0; i < N; i++) {
            char c = S.charAt(i);
            if (Character.isDigit(c)) size *= (c - '0');
            else size++;
        }
        for(int i = N - 1; i >= 0; i--) {
            char c = S.charAt(i);
            K %= size;
            if (K == 0 && Character.isLetter(c)) return Character.toString(c);
            if (Character.isDigit(c)) size /= (c - '0');
            else size--;
        }
        return null;
    }

2019.04.27

    public String decodeAtIndex(String S, int K) {
        long size = 0;
        char[] chs = S.toCharArray();
        for (int i = 0; i < chs.length; i++) {
            if (chs[i] >= '0' && chs[i] <= '9') size *= (chs[i] - '0');
            else size++;
        }
        for (int i = chs.length - 1; i >= 0; i--) {
            if ((K == 0 || K == size) && !Character.isDigit(chs[i])) return String.valueOf(chs[i]);
            if (chs[i] >= '0' && chs[i] <= '9') {
                size /= (chs[i] - '0');
                K %= size;
            }
            else size--;
        }
        return "";
    }

  

原文地址:https://www.cnblogs.com/hyserendipity/p/9742033.html