赞
踩
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));
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。