当前位置:   article > 正文

小米3面算法题_小米面试算法题

小米面试算法题

知乎上看到的一个小米公司面试的算法问题,非常有意思。自己也动手试了试。

原题:一副从1到n的牌,每次从牌堆顶取一张放桌子上,再取一张放牌堆底,直到手上没牌,最后桌子上的牌是从1到n有序,设计程序,输入n,输出牌堆的顺序数组。

  1. import java.util.ArrayList;
  2. import java.util.LinkedList;
  3. import java.util.List;
  4. import java.util.Scanner;
  5. public class test5 {
  6. public static void main(String[] args){
  7. Scanner sc = new Scanner(System.in);
  8. int n = sc.nextInt();
  9. ArrayList<Integer> b = new ArrayList<>();
  10. for(int i=0;i<n;i++){
  11. b.add(i+1);
  12. }
  13. System.out.println(getOriginalList(b));
  14. }
  15. //根据规则逆向还原。 b为新数组,a为原数组
  16. /*这里其实按照逆向规则应该是先原牌堆堆底的牌放回原牌堆堆顶,再执行新牌堆堆顶的牌放回原牌堆堆顶
  17. 但是由于正向规则执行到最后一次原牌堆只剩一张牌,直接放到新牌堆堆顶就结束了,所以逆向规则第一
  18. 次肯定是直接新牌堆堆顶放回原牌堆堆顶(没有原牌堆堆底放回堆顶的过程)。所以把新牌堆堆顶的牌放回
  19. 原牌堆堆顶先执行了,然后再执行原牌堆堆底的牌放回“堆顶”,这里我刻意把“堆顶”引起来是因为由于把
  20. 新牌堆堆顶的牌放回原牌堆堆顶先执行了,所以执行原牌堆堆底的牌放回“堆顶”这一步的时候其实已经不
  21. 再是放回堆顶了,而是堆顶的下一张才对。也就是为什么a.add(1, a.getLast())这里插入的索引是1
  22. */
  23. public static List<Integer> getOriginalList(List<Integer> b) {
  24. LinkedList<Integer> a = new LinkedList<>();
  25. while (b.size() > 0) {
  26. //新牌堆的堆顶返回原牌堆的堆顶
  27. a.addFirst(b.get(0));
  28. b.remove(0);
  29. if (a.size() > 2) { //2个元素以内执行原牌堆堆底返回堆顶跟不执行一样
  30. //原牌堆堆底返回原牌堆“堆顶”
  31. a.add(1, a.getLast());
  32. a.removeLast();
  33. }
  34. }
  35. return a;
  36. }
  37. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/1003245
推荐阅读
相关标签
  

闽ICP备14008679号