当前位置:   article > 正文

2023美团校招笔试(8.6)_美团机械方向笔试

美团机械方向笔试

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刚好是最后三个字符,那么可以直接得到最后的答案)如此循环,直到迭代到第一层。我们就可以求出最后的答案了。

这里面看到的美团题,今晚做美团看看去年的题,前面几个感觉都挺简单,最后一个稍微有点麻烦。

也不是模板题就纯模拟。

但是大佬们发现有循环,我吭哧吭哧的做了一下模拟的方法。

  1. import java.util.Scanner;
  2. public class Meituan {
  3. public static void main(String[] args) {
  4. Scanner sc = new Scanner(System.in);
  5. long k = sc.nextLong();
  6. long[] dp = new long[1000+7];
  7. String s = "Meituan";
  8. String suf = "wow";
  9. dp[0] = 7;
  10. int dep = 0;
  11. for(int i = 1; i < dp.length; i++) {
  12. dp[i] = dp[i - 1] * 2 + 3;
  13. if(k <= dp[i]) {
  14. dep = i;
  15. break;
  16. }
  17. }
  18. while(dep > 0) {
  19. long begin = dp[dep - 1];
  20. long end = dp[dep];
  21. if(k <= begin) {
  22. dep--;
  23. continue;
  24. }
  25. if(k >= end - 2) {
  26. System.out.println(suf.charAt((int) (k - end + 2)));
  27. return;
  28. }
  29. dep--;
  30. k = 2 * begin + 1 - k;
  31. }
  32. System.out.println(s.charAt((int) k - 1));
  33. }
  34. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/802309
推荐阅读
相关标签
  

闽ICP备14008679号