网易笔试

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

思路:如果n为偶数,则最后一步一定是通过机器2产生;如果n为基数,则最后一步一定是通过机器1产生。倒着往前推回去就可以了,可以使用递归来实现,不过一定要注意递归的终止条件。

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner scan=new Scanner(System.in);
        int n=scan.nextInt();
        StringBuilder sb=new StringBuilder();
       chooseMagic(n,sb);
       System.out.println(sb.reverse().toString());
        
    }
    static void chooseMagic(int n,StringBuilder sb){
//递归的终止条件
if(n==1){ sb.append("1"); return; } if(n==2){ sb.append("2"); return; } if(n%2==0){ sb.append("2"); chooseMagic((n-2)/2,sb); }else{ sb.append("1"); chooseMagic((n-1)/2,sb); } } }

2.有一个长度为N的正整数数列A = {A[1], A[2], A[3]..., A[N]}。
牛博士给小易出了一个难题:
对数列A进行重新排列,使数列A满足所有的A[i] * A[i + 1](1 ≤ i ≤ N - 1)都是4的倍数。
小易现在需要判断一个数列是否可以重排之后满足牛博士的要求。 

思路:偶数和偶数相乘肯定是4的倍数,4或4的倍数可以带走一个基数,所以问题转化成,

只要数组中,4或4的倍数的个数大于基数的个数就行了,是偶数但不是4的倍数的数字,可以放在一堆不用管。

import java.util.*;
public class Main{
    public static void main(String[] agrs){
        Scanner scan=new Scanner(System.in);
        int t=scan.nextInt();
        List<int[]> list=new ArrayList<int[]>();
        for(int i=0;i<t;i++){
            int n=scan.nextInt();
            int[] arr=new int[n];
            for(int k=0;k<n;k++){
                arr[k]=scan.nextInt();
            }
            list.add(arr);
        }
        for(int j=0;j<list.size();j++){
            System.out.println(isSatisfy(list.get(j)));
            
        }
    }
    static String isSatisfy(int[] arr){
        int c4=0;  //4的倍数
        int c2=0;  //2的倍数,但不是4的倍数
        int c=0;   //基数
        for(int i=0;i<arr.length;i++){
            if(arr[i]%4==0){
                c4++;
            }else if(arr[i]%2==0){
                c2++;
            }else{
                c++;
            }                
        }
        if(c4>=c && c2>0){
            return "Yes";
        }else if(c4+1>=c && c2==0){
            return "Yes";
        }else{
            return "No";
        }
            
    }
}

3.一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,"aaabbaaac"是由下面碎片组成的:'aaa','bb','c'。牛牛现在给定一个字符串,请你帮助计算这个字符串的所有碎片的平均长度是多少。

如样例所示: s = "aaabbaaac"
所有碎片的平均长度 = (3 + 2 + 3 + 1) / 4 = 2.25

思路:只需要求出一共有多少个片段就行了。另外要特别注意,java中,两个整数相除,如何让得到的结果保留两位小数。

int和int相除一定是一个整数,所以需要使用到String.format("%.2f",(double)a/(double)b)

原文地址:https://www.cnblogs.com/james111/p/7506698.html