《剑指offer》——扑克牌顺子

更多2019年的技术文章,欢迎关注我的微信公众号:码不停蹄的小鼠松(微信号:busy_squirrel),也可扫下方二维码关注获取最新文章哦~

T:

题目描述
LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。LL决定去买体育彩票啦。 现在,要求你使用这幅牌模拟上面的过程,然后告诉我们LL的运气如何。为了方便起见,你可以认为大小王是0。

思路不难,就是给定5个元素,判断是不是顺子。

  • 首先对元素排序,如果有相同元素出现,肯定不是对子;
  • 在一个顺子中,最大元素和最小元素的差值一定是4,比如:4,5,6,7,8。现在由于大小王的存在,差值要小于等于4.
  • 换一种方式,后一个元素减前一个元素再减一,其差值为0,依次减下去,并将差值相加,应该还是零。如果不是零,那这里就存在跳跃,中间漏掉的元素,就用0补上。

eg: 0,4,5,7,8 差值之和肯定为1,代表中间漏掉了1个元素,若差值之和为k,那么代表漏掉了k个元素。如果k的值大于前面0的值,那就没法补了,即不是顺子。

code:

	/**
	 * T: 扑克牌顺子
	 * 
	 * 题目描述
	 * LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...
	 * 他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!
	 * “红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,
	 * 他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。
	 * 上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。LL决定去买体育彩票啦。 
	 * 现在,要求你使用这幅牌模拟上面的过程,然后告诉我们LL的运气如何。为了方便起见,你可以认为大小王是0。
	 * 
	 * date: 2015.11.24  19:03
	 * @author SSS
	 *
	 */
	public class Solution {
	    
	    /**
		 * 先排序,在看非零元素之间的差值之和,是否能构成顺子
		 * @param numbers
		 * @return
		 */
	    public boolean isContinuous(int [] numbers) {
	        boolean flag = false;
	        if (numbers == null || numbers.length != 5) {
				return false;
			}
			
			int []temp = new int[numbers.length];
			for (int i = 0; i < numbers.length; i++) {
				temp[i] = numbers[i]; 
			}
			
			// 先对数组排序
			for (int i = 0; i < temp.length; i++) {
				int min = temp[i];
				int index = i;
				for (int j = i + 1; j < temp.length; j++) {
					if (temp[j] < min) {
						min = temp[j];
						index = j;
					}
				}
				temp[index] = temp[i];
				temp[i] = min; 
			}
			
			int zeroIndex = 0;
			// 找出有多少个0,即有多少个大/小王
			for (zeroIndex = 0; zeroIndex < temp.length && temp[zeroIndex] == 0; zeroIndex++);
			
			int count = 0;
			// 从非零处往后遍历,后者减前者,统计这个差的和是多少
			for (int i = zeroIndex; i < temp.length - 1; i++) {
	            if (temp[i] == temp[i + 1]) {	//如果有相同的元素存在,也不是顺子
					return flag;
				}
				count += temp[i + 1] - temp[i] - 1;
			}
			
			if (count <= zeroIndex) {
				flag = true;
			}
			
			return flag;
	    }
	}

更多2019年的技术文章,欢迎关注我的微信公众号:码不停蹄的小鼠松(微信号:busy_squirrel),也可扫下方二维码关注获取最新文章哦~

你可能感兴趣的:(算法,java)