版权声明:本文为博主原创文章,未经博主允许不得转载。 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));;
}
}