https://www.nowcoder.com/discuss/385404105085251584?sourceSSR=search
题意:初始字符串s为"Meituan",会经过若干次变换,每次变换按照s=s+r(s)+wow,来进行变换,r(s)表示s的反转之后的字符串,问第k(0<k<=1e18)个字符是什么?
思路:我们使用迭代的方法,找到第k个字符的迭代层数cnt,然后从cnt往前面不断反向迭代,也就是找第cnt次迭代的第k个字符相当于第cnt-1层的第几个字符。(注意,如果在某一层中位置k刚好是最后三个字符,那么可以直接得到最后的答案)如此循环,直到迭代到第一层。我们就可以求出最后的答案了。
这里面看到的美团题,今晚做美团看看去年的题,前面几个感觉都挺简单,最后一个稍微有点麻烦。
也不是模板题就纯模拟。
但是大佬们发现有循环,我吭哧吭哧的做了一下模拟的方法。
import java.util.Scanner;
public class Meituan {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long k = sc.nextLong();
long[] dp = new long[1000+7];
String s = "Meituan";
String suf = "wow";
dp[0] = 7;
int dep = 0;
for(int i = 1; i < dp.length; i++) {
dp[i] = dp[i - 1] * 2 + 3;
if(k <= dp[i]) {
dep = i;
break;
}
}
while(dep > 0) {
long begin = dp[dep - 1];
long end = dp[dep];
if(k <= begin) {
dep--;
continue;
}
if(k >= end - 2) {
System.out.println(suf.charAt((int) (k - end + 2)));
return;
}
dep--;
k = 2 * begin + 1 - k;
}
System.out.println(s.charAt((int) k - 1));
}
}