1. 程式人生 > >網易筆試

網易筆試

個數 進行 scanner ray 整數相除 logs div util tis

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)

網易筆試