网易笔试题(一):魔法币

问题描述

小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币。
魔法机器1:如果投入x个魔法币,魔法机器会将其变为2x+1个魔法币
魔法机器2:如果投入x个魔法币,魔法机器会将其变为2x+2个魔法币
小易采购魔法神器总共需要n个魔法币,所以小易只能通过两台魔法机器产生恰好n个魔法币,小易需要你帮他设计一个投入方案使他最后恰好拥有n个魔法币。

思路分析

这道题乍一看,没啥思路,我一开始也确实没啥思路。后来网上查了查大家的解释,才知道了这道题的考察点,魔法机器一产生的数是奇数,魔法机器二产生的数是偶数,所以可以利用奇偶的性质来倒推,常规的方法有两种,一个是循环,一个是递归,在数据量不是特别大二者都可以,但是数据量大的时候还是避免使用递归,以免堆栈溢出。

代码展示
package com.nowcoder;
import java.util.Scanner;
import org.junit.Test;
public class WY1 {
    @Test
    //解法一:循环
    public void fun1() {
        Scanner sc=new Scanner(System.in);
        while(sc.hasNextInt()) {
            int num=sc.nextInt();
            //使用StringBUffer是考虑到频繁的改变字符串,效率更高,同时又翻转函数可以调用
            StringBuffer sBuffer=new StringBuffer();
            while(num>0) {
                if (num%2==0) {
                    sBuffer.append('2');
                }else {
                    sBuffer.append('1');
                }
                num=(num-1)/2;//无论奇偶取整是一样的
            }
            System.out.println(sBuffer.reverse());
        }
    }
     @Test
    //解法二:递归
     public void fun2() {
         Scanner sc=new Scanner(System.in);
         while(sc.hasNextInt()) {
             int m=sc.nextInt();
             if (m>0) {
                 getMagic(m);
                 System.out.println();
            }

         }
     }
    private void getMagic(int m) {
        if (m==0) {
            return;
        }else if (m%2==0) {
            getMagic((m-2)/2);
            System.out.print('2');
        }else {
            getMagic((m-1)/2);
            System.out.print('1');
        }

    }
}

你可能感兴趣的:(互联网公司笔试题)