剑指offer_45:LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)... 他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012429555/article/details/89763202

题目: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的运气如何, 如果牌能组成顺子就输出true,否则就输出false。为了方便起见,你可以认为大小王是0。

原以为,连随机抽排的过程都要是模拟,于是写了个随机发牌的程序,每次发五张,结果仔细一审题,发现白写了,但是我放到这儿吧:

/*
	 * 生成特定的随机数组,理解错题目,本以为要读者本人自己写出发出抽牌的过程,
     *这个程序就写了方法不放回随机的过程
	*/
	public int[] getRandomFromArray(int[] array ,int count) {
		int[] result=new int[count];
		boolean r[]=new boolean[array.length];
		Random random=new Random();
		int m=count;
		if(m>array.length||m<0) {
			return array;
		} 
		int n=0;
		while(true) {
			int temp=random.nextInt(array.length);
			if (!r[temp]) {
				if (n==m) {
					break;
				}
				n++;
				result[n-1]=array[temp];
				r[temp]=true;
			}
			
		}
		return result;
		
	}

正式开始:

说实话题很简单,就看你是都数学分析能力咋样了,本来写的一款又长又恶心的,我也来恶心你们:

import java.util.Arrays;
public class Solution {
   public boolean isContinuous(int [] numbers) {
	/**
	 * 第一步:随机抽取五个数
	 */
		/*int[] result=new int[5];
		result=getRandomFromArray(numbers,5);
		*/
		if (numbers.length==0||numbers==null) {
			return false;
		}
		/**
		 * 0 出现的次数
		 */
		int count=0;//0 出现的次数
		for (int i = 0; i < numbers.length; i++) {
			if (numbers[i]==0) {
				count++;
			}
		}
		//0不出现
		if (count==0) {
			int c=0;
			int[] a=numbers;
			Arrays.sort(a);
			for (int i = 1; i<a.length; i++) {
				if (a[i]-a[i-1]==1) {
					c++;
				}
			}
			if (c==4) {
				return true;
			}
		}
		if (count==4) {
			return true;
		}
		if (count==3) {
			int[] temp_2=new int[3];
			int j=0;
			for (int i = 0; i < numbers.length; i++) {
				if (numbers[i]!=0) {
					temp_2[j]=numbers[i];
					j++;
				}
				
			}
			if (Math.abs(temp_2[0]-temp_2[1])<=4&&Math.abs(temp_2[0]-temp_2[1])>0) {
				return true;
			}
		}
		if (count==2) {
			int[] temp_2=new int[4];
			int cs_1=0;
			int cs_2=0;
			int j=0;
			for (int i = 0; i < numbers.length; i++) {
				if (numbers[i]!=0) {
					temp_2[j]=numbers[i];
					j++;
				}
				
			}
			for (int i = 1; i < temp_2.length; i++) {
				Arrays.sort(temp_2);
				if (temp_2[i]-temp_2[i-1]==1) {
					cs_1++;
				}
				if (temp_2[i]-temp_2[i-1]==2) {
					cs_2++;
				}
			}
			if (cs_1==2||cs_2==2) {
				return true;
			}
		}
		if (count==1) {
			int[] temp_2=new int[5];
			int cs_1=0;
			int cs_2=0;
			int j=0;
			for (int i = 0; i < numbers.length; i++) {
				if (numbers[i]!=0) {
					temp_2[j]=numbers[i];
					j++;
				}
			}
			Arrays.sort(temp_2);
			for (int i =2; i < temp_2.length; i++) {
				if (temp_2[i]-temp_2[i-1]==1) {
					cs_1++;
				}
				if (temp_2[i]-temp_2[i-1]==2) {
					cs_2++;
				}
			}
			if (cs_1==2&&cs_2==1) {
				return true;
			}
		}
		return false;
	  
	}
}

后来自己实在受不了了,就好好改了一下:

import java.util.Arrays;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
public class Solution {
 public static boolean isContinuous(int [] numbers) {
		//如果为空,直接返回false
		if (numbers.length==0||numbers==null) {
			return false;
		}
		//依次讨论0 出现的次数
		int count=0;
		ArrayList<Integer> num_arrary=new ArrayList<>();
		for (int i = 0; i < numbers.length; i++) {
			if (numbers[i]==0) {
				count++;
			}else {
				num_arrary.add(numbers[i]);
			}	
		}
		//对不为0的数进行排序
		Collections.sort(num_arrary);
		//0不出现
		if (count==0) {
			int c=0;
			int[] a=numbers;
			Arrays.sort(a);
			for (int i = 1; i<a.length; i++) {
				if (a[i]-a[i-1]==1) {
					c++;
				}
				if (c==4) {
					return true;
				}
			}
		}
		//0 出现4次的情况
		if (count==4) {
			return true;
		}
		//0 出现3次的情况
		if (count==3) {
			int a=num_arrary.get(0);
			int b=num_arrary.get(1);
			if (Math.abs(a-b)<=4&&Math.abs(a-b)>0) {
				return true;
			}
		}
		//0 出现两次的情况
		if (count==2||count==1) {
			int cs_1=0;
			int cs_2=0;
			for (int i = 1; i < num_arrary.size(); i++) {
				int a=num_arrary.get(i);
				int b=num_arrary.get(i-1);
				if (a-b==1) {
					cs_1++;
				}
				if (a-b==2) {
					cs_2++;
				}
			}
			if (count==2) {
				if (cs_1==2||cs_2==2) {
					return true;
				}
				
			}else {
				if (cs_1==2&&cs_2==1) {
					return true;
				}
			}
			
		}
		return false;
	  
	}
}

最后就是整个程序:

package offer_java;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Random;

/*
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的运气如何, 如果牌能组
成顺子就输出true,否则就输出false。为了方便起见,你可以认为大小王是0。
*/
public class isContinuous {
	public static boolean isContinuous(int [] numbers) {
		//如果为空,直接返回false
		if (numbers.length==0||numbers==null) {
			return false;
		}
		//依次讨论0 出现的次数
		int count=0;
		ArrayList<Integer> num_arrary=new ArrayList<>();
		for (int i = 0; i < numbers.length; i++) {
			if (numbers[i]==0) {
				count++;
			}else {
				num_arrary.add(numbers[i]);
			}	
		}
		//对不为0的数进行排序
		Collections.sort(num_arrary);
		//0不出现
		if (count==0) {
			int c=0;
			int[] a=numbers;
			Arrays.sort(a);
			for (int i = 1; i<a.length; i++) {
				if (a[i]-a[i-1]==1) {
					c++;
				}
				if (c==4) {
					return true;
				}
			}
		}
		//0 出现4次的情况
		if (count==4) {
			return true;
		}
		//0 出现3次的情况
		if (count==3) {
			int a=num_arrary.get(0);
			int b=num_arrary.get(1);
			if (Math.abs(a-b)<=4&&Math.abs(a-b)>0) {
				return true;
			}
		}
		//0 出现两次的情况
		if (count==2||count==1) {
			int cs_1=0;
			int cs_2=0;
			for (int i = 1; i < num_arrary.size(); i++) {
				int a=num_arrary.get(i);
				int b=num_arrary.get(i-1);
				if (a-b==1) {
					cs_1++;
				}
				if (a-b==2) {
					cs_2++;
				}
			}
			if (count==2) {
				if (cs_1==2||cs_2==2) {
					return true;
				}
				
			}else {
				if (cs_1==2&&cs_2==1) {
					return true;
				}
			}
			
		}
		return false;
	  
	}
	/*
	 * 生成特定的随机数组,理解错题目,本以为要读者本人自己写出发出抽牌的过程,
     *这个程序就写了方法不放回随机的过程
	*/
	public int[] getRandomFromArray(int[] array ,int count) {
		int[] result=new int[count];
		boolean r[]=new boolean[array.length];
		Random random=new Random();
		int m=count;
		if(m>array.length||m<0) {
			return array;
		} 
		int n=0;
		while(true) {
			int temp=random.nextInt(array.length);
			if (!r[temp]) {
				if (n==m) {
					break;
				}
				n++;
				result[n-1]=array[temp];
				r[temp]=true;
			}
			
		}
		return result;
		
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		  int[] c={0,3,1,6,4};
		  System.out.println(isContinuous(c));;
	}

}

猜你喜欢

转载自blog.csdn.net/u012429555/article/details/89763202