1. 程式人生 > >JAVA語言解決一測試小例題

JAVA語言解決一測試小例題

/*
 * 阿里30分鐘程式設計小測評
 * 題目: 
現在很多家長都會送小孩子去培訓中心學習舞蹈, 
有一次舞蹈培訓中心考試,因為小孩子要哄著才能更喜歡學, 
所以老師給孩子們準備了小貼紙獎勵孩子, 
考試結束以後孩子們按照大小個站成一排,老師按照順序給孩子們 
發小貼紙,每個孩子都會至少得到一個小貼紙,因為是按照大小個 
站成一排的,所以相鄰的孩子成績略有高低,為了鼓勵相鄰孩子 
向成績好的孩子學習,成績高的孩子會比成績弱的孩子得到的小貼紙多, 
請問至少需要多少小貼紙發給孩子們?

理解:就是分數高的小朋友至少要比鄰域的小朋友多一張貼紙!,頭尾就只有一個鄰域小朋友!

Solution1:
測試例子:
成績:2,4,5,2,3
貼紙:1,1,1,1,1
貼紙:1,2,3,1,2

Solution1:
成績:5,4,2,3,2
貼紙:1,1,1,1,1
貼紙:2,2,1,2,1

Solution2:(一直迭代,直到收斂),即特殊情況:按分數有序時,要通過迭代的方式。
成績:5,4,2,3,2
貼紙:1,1,1,1,1
貼紙:2,2,1,2,1
貼紙:3,2,1,2,1

 * 
 * 
 */

參考這篇博文有一個解決方式:

import java.util.*;
class Solution1 
{
    public int candy(int[] ratings)
    {
        if(ratings==null || ratings.length==0)
            return 0;
        int len=ratings.length;
        int num=0;
        int[] candy=new int[len];
        Arrays.fill(candy,1);//把candy的元素初始化為1;
        for(int i=0;i<len;i++)
        {
            if(i!=len-1 && ratings[i]>ratings[i+1] && candy[i]<=candy[i+1])
            {
                candy[i]=candy[i+1]+1;
            }
            if(i>0 && ratings[i]>ratings[i-1] && candy[i]<=candy[i-1])
            {
                candy[i]=candy[i-1]+1;
            }
        }
        for(int i=0;i<len;i++)
            num+=candy[i];
    return num;
    }
}

上面這個Solution1,只遍歷了一遍成績陣列,對於每一個元素,判斷其分數與前一個和後一個的大小關係和前後貼紙的大小關係。

以上程式碼Solution1在邏輯上有缺陷,對於分數按序排列這種情況就輸出不符合題意,但確實通過了網站上的測試用例。

參考下面的例子,完整包括輸入輸出,以及修改後的Solution2程式碼!,以及2組測試用例:

package aliceshi1package;

/*
 * 阿里30分鐘程式設計小測評
 * 題目: 
現在很多家長都會送小孩子去培訓中心學習舞蹈, 
有一次舞蹈培訓中心考試,因為小孩子要哄著才能更喜歡學, 
所以老師給孩子們準備了小貼紙獎勵孩子, 
考試結束以後孩子們按照大小個站成一排,老師按照順序給孩子們 
發小貼紙,每個孩子都會至少得到一個小貼紙,因為是按照大小個 
站成一排的,所以相鄰的孩子成績略有高低,為了鼓勵相鄰孩子 
向成績好的孩子學習,成績高的孩子會比成績弱的孩子得到的小貼紙多, 
請問至少需要多少小貼紙發給孩子們?

Solution1:
測試例子:
成績:2,4,5,2,3
貼紙:1,1,1,1,1
貼紙:1,2,3,1,2

Solution1:
成績:5,4,2,3,2
貼紙:1,1,1,1,1
貼紙:2,2,1,2,1

Solution2:(一直迭代,直到收斂)
成績:5,4,2,3,2
貼紙:1,1,1,1,1
貼紙:2,2,1,2,1
貼紙:3,2,1,2,1

 * 
 * 
 */

import java.util.Arrays;
import java.util.Scanner;
class Solution 
{
    public int gift(int[] ratings)
    {
        if(ratings==null || ratings.length==0)
            return 0;
        int len=ratings.length;
        int num=0;
        int[] gift=new int[len];
        Arrays.fill(gift,1);//把gift的元素初始化為1,因為每個孩子至少得到一個紙貼獎勵
        for(int i=0;i<len;i++)
        {
            if(i!=len-1 && ratings[i]>ratings[i+1] && gift[i]<=gift[i+1])//與右邊的比較
            {
                gift[i]=gift[i+1]+1;
            }
            if(i>0 && ratings[i]>ratings[i-1] && gift[i]<=gift[i-1])//與左邊的比較
            {
                gift[i]=gift[i-1]+1;
            }
        }
        for(int i=0;i<len;i++)
		{	
			System.out.print(gift[i]);
			System.out.print(",");
            num+=gift[i];
		}
        System.out.println();
    return num;
    }
}

class Solution2 
{
    public int gift(int[] ratings)
    {
        if(ratings==null || ratings.length==0)
            return 0;
        int len=ratings.length;
        int num=0;
        int[] gift=new int[len];
        Arrays.fill(gift,1);//把gift的元素初始化為1,因為每個孩子至少得到一個紙貼獎勵
		int[] giftPre=new int[len];
		Arrays.fill(giftPre,1);
		
/*         for(int i=0;i<len;i++)
        {
            if(i!=len-1 && ratings[i]>ratings[i+1] && gift[i]<=gift[i+1])
            {
                gift[i]=gift[i+1]+1;
            }
            if(i>0 && ratings[i]>ratings[i-1] && gift[i]<=gift[i-1])
            {
                gift[i]=gift[i-1]+1;
            }
        } */
		
		while(true)
		{
			for(int i=0;i<len;i++)
			{
				if(i!=len-1 && ratings[i]>ratings[i+1] && gift[i]<=gift[i+1])//與右邊的比較
				{
					gift[i]=gift[i+1]+1;
				}
				if(i>0 && ratings[i]>ratings[i-1] && gift[i]<=gift[i-1])//與左邊的比較
				{
					 gift[i]=gift[i-1]+1;
				}
			}
			if(Arrays.equals(gift,giftPre))//判斷兩個陣列是否相等,相等了就停止迭代!
			{
				break;
			}
			else
			{
				//System.arraycopy(src, srcStratPos, dest, destStartPos, len);
				System.arraycopy(gift, 0, giftPre, 0, len);
			}
			
		}
		
        for(int i=0;i<len;i++)
		{
            num+=gift[i];
			System.out.print(gift[i]);
			System.out.print(",");
		}
        System.out.println();
    return num;
    }
}

public class Main {
	public static void main(String[] args)
	{
		System.out.println("請輸入分數,以英文逗號分隔,:");
		Scanner scanner = new Scanner(System.in);
		String str = scanner.nextLine();//首先得到一行輸入(以逗號分隔的一組資料),字串形式str
		String [] strRating=str.split(","); //去掉str的分割逗號,得到字元陣列strRating
		int [] nums=new int[strRating.length];//整數陣列
		for(int i=0;i<strRating.length;i++){
			nums[i]=Integer.parseInt(strRating[i]);//將字元陣列的元素轉換成整數陣列
		}
        Solution sol=new Solution();//建立一個Sloution物件sol
		int ans=sol.gift(nums);//通過sol物件呼叫其成員函式gift()得到結果
		System.out.println(ans);
		
		Solution2 sol2=new Solution2();
		int ans2=sol2.gift(nums);
		System.out.println(ans2);
		scanner.close();
		 
	}
}

/*
請輸入分數,以英文逗號分隔,:
2,4,5,2,3
1,2,3,1,2,
9
1,2,3,1,2,
9

請輸入分數,以英文逗號分隔,:
5,4,2,3,2
2,2,1,2,1,
8
3,2,1,2,1,
9



*/

備註:JAVA的陣列操作更加靈活方便,趕快去學JAVA啊,要麼安卓開發,要麼JAVA Web開發,大資料也要用JAVA?!

語言不嫌多,就看你用在哪裡?需求在做選擇!

JAVA 程式設計小練習