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

 * 
 * 
 */

参考这篇博文有一个解决方式:

[1]https://blog.csdn.net/weixin_41961130/article/details/81111622
 

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 编程小练习 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值