当前位置:   article > 正文

最近知乎很火的小米三面算法_小米 知乎

小米 知乎

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

知乎上看了微软大神给的思路,我在这翻译一下。。。

以n=5为例,

每位对应的槽                1    2     3    4    5                 

原来的数组                    1    2    3    4    5     ------(1)

变换一次后的数组         1    3    5    4    2     ------(2)

.....

推出结果前一次的数组  1    5    2    4    3     ------- (3)

最后的顺序数组             1    2    3    4    5     ------- (4)

由题意知我们要推的是 {.......} 变换得到 1 2 3 4 5

因为(2)是由(1)变换得到的,槽2到了槽5,槽3到了槽2,槽4到了槽4,槽5到了槽3,

所以逆推的话,是由(4)推回(3),也就是说,(4)中的槽5的数字应该到(3)中的槽2,槽2到了槽3,槽4到了槽4,槽3到了槽5,按照这个逻辑写出来就是(3),所以(3)反过来正推就是(4)。

代码如下:

  1. public class Demo {
  2. public static void main(String[] args) {
  3. Scanner input = new Scanner(System.in);
  4. int n = input.nextInt();
  5. test(n);
  6. }
  7. public static void test(int n){
  8. HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
  9. int[] table = getChangeResult(n);
  10. for(int i=0; i<n; i++){
  11. map.put(table[i], i+1);
  12. }
  13. int[] res = new int[n];
  14. for(int j=0; j<n; j++){
  15. res[j] = map.get(j+1);
  16. }
  17. printRes(res);
  18. }
  19. private static void printRes(int[] res) {
  20. for(int result : res){
  21. System.out.print(result+" ");
  22. }
  23. }
  24. private static int[] getChangeResult(int n){
  25. ArrayList<Integer> list = new ArrayList<Integer>();
  26. int[] table = new int[n];
  27. int temp = 0;
  28. int index = 0;
  29. for(int i=0;i<n;i++){
  30. list.add(i+1);
  31. }
  32. while(list.size()>0){
  33. //step 1
  34. temp = list.get(0);
  35. table[index] = temp;
  36. index++;
  37. list.remove(0);
  38. if(list.size()==0)
  39. break;
  40. //step 2
  41. list.add(list.get(0));
  42. list.remove(0);
  43. }
  44. return table;
  45. }
  46. }

如有不足之处,请指正。

以上。

To be continued...


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

闽ICP备14008679号