算法题-选择排序加顺子对子判断
Posted 左羊公社
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法题-选择排序加顺子对子判断相关的知识,希望对你有一定的参考价值。
你与别人花费一样的时间,因为别人用心,而你吊儿郎当,所以到了最后检验成果的时候,别人成功,而你除了赔了时间之后,一无所得。(by 飞行员舒克)
给定一个整数数组随机给出五个值,判断其中是否包含一个顺子和一个对子,如果包含一个顺子和一个对子返回true,反之返回false。但是只能使用基本的数组排序、循环、赋值等方法完成,不要用map、list、Arrays等。
示例:
给定 nums = [1, 2, 1, 3,1]
因为 nums中包含顺子123和对子11
所以返回 true
首先对数组进行排序,这里我使用的是选择排序。
//选择排序的方法
public static void selectSort(int [] a) {
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a.length-1; j++) {
if(a[j+1]<a[j]) {//判断当前数是否大于最后的数,如果是就将两数调换位置
int temp = a[j];//创建一个临时变量储存当前数
a[j] = a[j+1];//当前数等于最后一个数
a[j+1] = temp;//最后一个数等于临时变量也就是当前数
}
}
}
}
其次判断是否为顺子,用后一个数减去前一个数是否等于1来判断是否为顺子。
//判断是否为顺子的方法
public static boolean isShunZi(int [] a) {
boolean bool = true;
for (int i = 0; i < a.length-1; i++) {
if(a[i+1]-a[i]!=1) { //用后一个数减去前一个数是否等于1来判断是否为顺子
bool = false;
break;
}
}
// System.out.println(bool);
return bool;
}
最后判断是否为对子,如果是就排除对子将剩余的值存入顺子数组。
//判断是否为一个顺子带一对的方法
public static boolean test(int [] a) {
int index = -1;//用来记录对子中第一个元素的下标
int [] shunzi = new int [a.length-2];//用来存放顺子
//首先对数组进行排序,这里使用的选择排序
selectSort(a);
//将数组从小到大排好序后,双重循环找到重复元素出现的下标
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a.length-1; j++) {
if(a[j+1]==a[j]) {//如果当前数等于下一个数就代表他俩是相同的值
index = j;
}
}
}
// System.out.println(index);
// System.out.println(index+1);
//根据下标,去除一个对子,将剩下的元素存放到一个新的数组,这个数组仍然是有序的
for (int i = 0,j=0; i < a.length; i++) {//j为顺子数组下标
if(i!=index&&i!=(index+1)) {//如果i不等当前index同时不等于index+1就把这个数存入顺子数组
shunzi[j] = a[i];
j++;
}
}
//调用判断是否为顺子的方法
return isShunZi(shunzi);
}
最后附上完整代码
package t0402;
public class Test01 {
//判断是否为一个顺子带一对的方法
public static boolean test(int [] a) {
int index = -1;//用来记录对子中第一个元素的下标
int [] shunzi = new int [a.length-2];//用来存放顺子
//首先对数组进行排序,这里使用的选择排序
selectSort(a);
//将数组从小到大排好序后,双重循环找到重复元素出现的下标
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a.length-1; j++) {
if(a[j+1]==a[j]) {//如果当前数等于下一个数就代表他俩是相同的值
index = j;
}
}
}
// System.out.println(index);
// System.out.println(index+1);
//根据下标,去除一个对子,将剩下的元素存放到一个新的数组,这个数组仍然是有序的
for (int i = 0,j=0; i < a.length; i++) {//j为顺子数组下标
if(i!=index&&i!=(index+1)) {//如果i不等当前index同时不等于index+1就把这个数存入顺子数组
shunzi[j] = a[i];
j++;
}
}
//调用判断是否为顺子的方法
return isShunZi(shunzi);
}
//选择排序的方法
public static void selectSort(int [] a) {
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a.length-1; j++) {
if(a[j+1]<a[j]) {//判断当前数是否大于最后的数,如果是就将两数调换位置
int temp = a[j];//创建一个临时变量储存当前数
a[j] = a[j+1];//当前数等于最后一个数
a[j+1] = temp;//最后一个数等于临时变量也就是当前数
}
}
}
}
//判断是否为顺子的方法
public static boolean isShunZi(int [] a) {
boolean bool = true;
for (int i = 0; i < a.length-1; i++) {
if(a[i+1]-a[i]!=1) { //用后一个数减去前一个数是否等于1来判断是否为顺子
bool = false;
break;
}
}
// System.out.println(flag);
return bool;
}
//主方法测试,成功
public static void main(String[] args) {
int [] a1 = {2,2,2,3,4};
System.out.println(test(a1));
}
}
输出结果
左羊公社
扫描发现更多精彩
以上是关于算法题-选择排序加顺子对子判断的主要内容,如果未能解决你的问题,请参考以下文章