880. 索引处的解码字符串

给定一个编码字符串 S。为了找出解码字符串并将其写入磁带,从编码字符串中每次读取一个字符,并采取以下步骤:

  • 如果所读的字符是字母,则将该字母写在磁带上。
  • 如果所读的字符是数字(例如 d),则整个当前磁带总共会被重复写 d-1 次。

现在,对于给定的编码字符串 S 和索引 K,查找并返回解码字符串中的第 K 个字母。

 

示例 1:

输入:S = "leet2code3", K = 10
输出:"o"
解释:
解码后的字符串为 "leetleetcodeleetleetcodeleetleetcode"。
字符串中的第 10 个字母是 "o"。

示例 2:

输入:S = "ha22", K = 5
输出:"h"
解释:
解码后的字符串为 "hahahaha"。第 5 个字母是 "h"。

示例 3:

输入:S = "a2345678999999999999999", K = 1
输出:"a"
解释:
解码后的字符串为 "a" 重复 8301530446056247680 次。第 1 个字母是 "a"。

 

提示:

  1. 2 <= S.length <= 100
  2. S 只包含小写字母与数字 2 到 9 。
  3. S 以字母开头。
  4. 1 <= K <= 10^9
  5. 解码后的字符串保证少于 2^63 个字母。

思路:利用题目特性将K缩小。

如leet2ef2e

2 ,4

2,10

若是6,则6-4=2

若是11,则11-10=1

class Solution {
public:
    string decodeAtIndex(string S, int K) {
        long long len=0;
        vector<vector<long long>> s;
        for(int i=0;len<K;i++){
            if(isdigit(S[i])){
                vector<long long> ss;
                //cout<<len<<" "<<S[i]-'0'<<endl;
                ss.push_back(len);
                ss.push_back(S[i]-'0');
                len*=S[i]-'0';
                s.push_back(ss);
            }else{
                len++;
            }
        }
        int size=s.size();
        
        for(int i=size-1;i>=0;i--){
            //cout<<"i:"<<s[i][1]<<endl;
            for(int j=1;j<s[i][1]&&K>s[i][0];j++){
                K-=s[i][0];
            }
            //cout<<K<<endl;
        }
        for(int i=0;i<K;i++){
            if(isdigit(S[i]))
                K++;
        }
        int i=K;
        string f;
        f+=S[i-1];
        return  f;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值