算法题-选择排序加顺子对子判断

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));

        }
}

输出结果



左羊公社

扫描发现更多精彩



以上是关于算法题-选择排序加顺子对子判断的主要内容,如果未能解决你的问题,请参考以下文章

算法题7 判断扑克牌中的顺子

剑指Offer对答如流系列 - 扑克牌的顺子

剑指offer:扑克牌顺子

44扑克牌中的顺子

python编写扎金花小程序

算法:扑克牌的顺子