剑指offer面试题44 扑克牌的顺子(java实现)

来源:互联网 发布:java可逆的加密算法 编辑:程序博客网 时间:2024/06/14 05:58

算法思路:

1.对数组进行排序;

2.统计数组中0的个数;

3.统计排序之后的数组中相邻数组之间的空缺数进行判断。如果空缺的总数小于或者等于0的个数,那么这个数组是连续的;反之则不连续。

public class Solution {public boolean isContinuous(int[] numbers) {if (numbers == null || numbers.length != 5) {return false;}// 做三件事// 1.对数组进行排序// 2.统计数组中0的个数// 3.统计排序之后的数组中相邻数字之间的空缺总数// 1.对数组进行排序quickSortByPartition(numbers, numbers.length, 0, numbers.length - 1);// 2.统计数组中0的个数int numOf0 = 0;for (int i = 0; i < numbers.length; i++) {if (numbers[i] == 0) {numOf0++;}}// 统计排序数组中两两之间的间隔数// 定义一个指针,从数组的第一个非0元素开始int numOfGap = 0;// 指向前一个元素int small = numOf0;// 指向后一个元素int big = numOf0 + 1;// 在后一个元素不越界的情况下while (big < numbers.length) {if (numbers[small] == numbers[big]) {// 一旦相邻两元素相等,肯定不是顺子return false;}// 相邻两元素不等,现在肯定是big指向元素大于small指向元素if (numbers[big] - numbers[small] == 1) {// 此时两个元素正好相邻,两个指针后移small++;big++;} else {// 此时两个元素不相邻,中间隔的数>=1个// 获取当前这两个数字之间间隔几个数numOfGap = numbers[big] - numbers[small] - 1;// 判断拥有的0是否能补救if (numOfGap > numOf0) {// 所需间隔数>0的个数,无法补救,肯定不是顺子return false;} else {// 此时numOfGap <= numOf0,当前情况下可以补救,则进行补救,将0的个数减少// 即当前情况用去numOfGap个0numOf0 = numOf0 - numOfGap;small++;big++;}}}return true;}public void quickSortByPartition(int[] arr, int length, int start, int end) {if (start == end) {return;}int index = partition(arr, length, start, end);if (index > start) {quickSortByPartition(arr, length, start, index - 1); }if (index < end) {quickSortByPartition(arr, length, index + 1, end);}}public int partition(int[] arr, int length, int start, int end) {if (arr == null || length <= 0 || start < 0 || end >= length) {System.out.println("数组输入有误");return -1;}// 随机选取一个支点int index = (start + end) / 2;// 交换支点和数组最后一个元素,此时支点元素变为数组中最后一个元素swap(arr,index, end);// small初始时指向开始元素的前一个位置,用于作为小于等于支点元素的边界索引int small = start - 1;for (index = start; index < end; index++) {// 如果index所指元素小于或者等于支点元素if (arr[index] < arr[end]) {small++;if (small != index) {swap(arr,index, small);}}}// 对small的索引加1,用于放置支点元素small++;// 交换small位置和end位置的元素,即将支点元素换到small位置swap(arr,small, end);return small;}/** * 交换两个数 * @param arr  */private void swap(int[] arr, int index1, int index2) {int temp = arr[index1];arr[index1] = arr[index2];arr[index2] = temp;}