某家超市有一种促销手段,购买金额超过一定金额就给一张随机编号奖票。编号是一个1到100之间的数字。当收集到连续编号的三张贴花时,就可以换一个小礼物。兑换完礼物后,该奖票就作废。
小明经常去某家超市购物,积攒了不少奖票,你帮他看看,能换多少小礼物。
输入格式:
首先是一个正整数N(1<N<100),表示小明手上的奖票的数量。 然后是N个正整数JP(1<=JP<=100),每个数字表示一张奖票的编号。
输出格式:
输出一个数字,表示小明可以换的小礼物的数量。如果不能换小礼物,就输出0。
输入样例:
在这里给出一组输入。例如:
6
3 2 4 6 6 4
输出样例:
在这里给出相应的输出。例如:
1
基本思想
1、奖票无序且可以重复,所以就算完成了排序,还是需要查询该数之前和之后的所有数据,代码长而且效率低
2、参考哈希表的思想,单独列出一个长度为100的数组,当对应的下标处有奖票的时候就在对应的位置+1,存完之后就可以得到有哪些奖票及其数量。
3、然后对该数组进行一次遍历就可以得到能够兑换到奖票的数量。
代码如下
import java.util.Scanner;
public class Main{
public static void main(String[] arg) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();//得到奖票的数量
int num = 0;
int ans[] = new int[100];//设定奖票存储的数组
int temp;
for (int i = 0; i < n; i++) {//放入数据
temp = in.nextInt();
ans[temp-1]++;
}
//得到能兑换到礼物的关键代码
int i = 1;
while(i < 99) {
if(ans[i] == 0) i = i + 2;
/*如果没有该类型奖票(ans=0)
那么他的下一张选票也一定不符合要求
,所以直接判断下面的第二张奖票*/
else if (ans[i-1] != 0 && ans[i+1] != 0 && ans[i] != 0) {
/*如果该奖票数量不为0,
那么就需要该奖票的前后的奖票都需要有才能换来礼品,
而且当该奖票-1后仍然不为0时,就应该继续判断,不能i++*/
ans[i]--;
ans[i-1]--;
ans[i+1]--;
num ++;
}else i++;
}
System.out.print(num);
}
}