剑指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;}
阅读全文
0 0
- 剑指Offer面试题44:扑克牌的顺子 Java实现
- 剑指offer面试题44 扑克牌的顺子(java实现)
- 《剑指Offer》面试题:扑克牌的顺子
- 剑指offer面试题 扑克牌的顺子
- 剑指offer 面试题44 扑克牌顺子
- 剑指offer--面试题44:扑克牌顺子
- 剑指offer面试题44扑克牌的顺子
- 剑指offer--面试题44:扑克牌的顺子--用哈希表
- 剑指Offer:面试题44 扑克牌的顺子
- 剑指offer 面试题44—扑克牌的顺子
- 《剑指Offer》学习笔记--面试题44:扑克牌的顺子
- 【剑指Offer学习】【面试题44:扑克牌的顺子】
- 剑指offer-面试题44:扑克牌的顺子
- 剑指offer之面试题44扑克牌的顺子
- 剑指offer——面试题44:扑克牌的顺子
- 剑指offer-面试题44-扑克牌的顺子
- 剑指offer 面试题44 扑克牌的顺子
- [剑指offer][面试题44]扑克牌的顺子(待完善)
- MFC的学习!
- JS闭包详析_懂不懂由你,反正我是懂了
- CRM加下拉框里面的值
- jQuery和AngularJS的区别浅析
- 开发商前缀那些事儿
- 剑指offer面试题44 扑克牌的顺子(java实现)
- 用户10秒内不操作浏览器自动刷新跳转
- UITableView属性及方法大全
- Netty5 + WebSocket 练习
- web前端开发,常用的在线占位图网址总结
- 操作系统养成计划之篇二:死锁实战篇——银行家算法
- 单例模式
- maven中项目目录显示不全解决方案
- RocketMQ原理解析-consumer 4.长轮询push消息—并发消费消息