冰封侠 @ 2022-02-16 22:41:24
我按照题解的思路自己打的代码,和题解差不多,但不明白为什么我的代码会超时,求dalao解答
以下是源代码
#include<iostream>
#include<string>
using namespace std;
long long n, len, i;
string s;
int main() {
cin >> s >> n;
len = s.length();
while(n > s.length()) {
while (len < n) len *= 2;
len = len / 2;
n -= 1 + len;
if (n == 0) n = len;
}
cout << s[n - 1] << endl;
return 0;
}
by Amore_eterno @ 2022-02-16 22:42:55
@冰封侠 s.length()每次都得算一遍,每次都是O(n)的
by Loser_King @ 2022-02-16 23:12:06
@Konnyaku41377 s.length() 是 O(1) 的,C 里的 strlen(s) 是 O(n) 的。
by pocafup @ 2022-02-17 04:49:33
跟第一篇题解大同小异,但你没用 i 啊
具体逻辑没认真看,但题解的 len 是不变的,而你这个是变的
by 冰封侠 @ 2022-02-17 20:04:56
@pocafup 在题解的 "while(num<n)" 中我觉得num可以用s.length()替代,所以就换掉了。然后用len来代替num的作用,就没有定义i。
by 冰封侠 @ 2022-02-17 20:06:52
@Konnyaku41377 好像不是这个的问题,我把题解的代码复制下来,把
while(num<n)
换成
while(n > s.length())
也不会超时
by pocafup @ 2022-02-18 00:32:32
@冰封侠 每次初始化len即可