笔试算法题(21):将stack内外颠倒 & 判断扑克牌顺子
出题:要求用递归将一个栈结构的元素内外颠倒;
分析:
- 本题再次说明系统栈是程序员最好的帮手,但递归度较高所以时间复杂度较大,可以使用空间换时间的方法(额外数组保存栈元素,然后逆向压入);
- 第一层递归(清空栈元素,并使用系统栈保存):[1,2,3,4,5],栈顶元素为1,将1弹出之后,递归处理[2,3,4,5];
- 第二层递归(将栈顶元素插入到栈底,同样使用系统栈保存):当[2,3,4,5]已经逆序之后,需要将1插入到栈底,所以将1作为参数传递到递归调用中,之后递归处理2和[3,4,5];
解题:
- class MyStack {
- private:
- int *array;
- int capability;
- int top;
- public:
- MyStack(int cap=): array((int*)malloc(sizeof(int)*cap)), capability(cap), top() {}
- ~MyStack() {delete [] array;}
- bool isFull() {
- return top == capability;
- }
- bool isEmpty() {
- return top == ;
- }
- int freeSlot() {
- return capability - top;
- }
- /**
- * top当前的位置就是下一个push元素所在的slot
- * */
- bool push(int n) {
- if(isFull()) return false;
- array[top++]=n;
- return true;
- }
- bool pop(int *n) {
- if(isEmpty()) return false;
- *n=array[--top];
- return true;
- }
- void ShowStack() {
- int temp=top-;
- printf("\n");
- for(int i=;i<=temp;i++)
- printf("%d, ",array[i]);
- printf("\n");
- }
- };
- void AddToBottom(MyStack *stack, int top) {
- int curTop;
- if(stack->pop(&curTop)) {
- AddToBottom(stack, top);
- stack->push(curTop);
- }else
- stack->push(curTop);
- }
- void ReverseStack(MyStack *stack) {
- int top;
- if(stack->pop(&top)) {
- ReverseStack(stack);
- AddToBottom(stack, top);
- }
- }
出题:从扑克牌中随机抽出5张牌,判断是否为顺子(顺子则为连续的5张牌,A为1, 2-10为其本身,J为11,Q为12,K为13,大小王可代替任意数字,13在中间的连续不算顺子);
分析:
- 解法1:首先确认5个数中除0之外没有其他重复的数字,如果有则失败,并且找到最大值max,最小值min和0的个数(count0);然后如果max-min<=4则成立,否则失败,此方法不用排序;
- 解法2:首先对5个数字进行排序,然后使用king索引最右边的0,使用index遍历king之后的所有元素,一旦遇到next与current有大于 1的差值,则将king向左移动并判断是否超出数组下限,如果超出则返回false;如果next到达数组上限则返回true;
- 解法3:将大小王的大小看做0,首先对5个数字进行排序,然后统计0的个数,然后统计数组中连续数字是否有空缺,如果没有说明有重复出现的牌,则失败;如果空缺数大于统计的0的个数,则说明王不够用于替换所有的空缺,失败;
- 所以判断K个数字是否连续的最直接的方法就是判断其max和min的差值是否小于K个数字;
解题:
- /**
- * 解法1:
- * */
- bool BetterVersion(int *array, int length) {
- int hash[];
- int max=array[],min=array[];
- /**
- * 使用一个14个元素的int数组表示13个数字和王(0)
- * 全部初始化为0
- * */
- for(int i=;i<;i++)
- hash[i]=;
- for(int i=;i<length;i++) {
- if(array[i]==)
- hash[]++;
- else {
- /**
- * max和min仅在1到13之间统计
- * 并且一旦某个数字出现两次,则失败
- * */
- if(hash[array[i] == )
- hash[array[i]=;
- else
- return false;
- if(array[i]>max) max=array[i];
- if(array[i]<min) min=array[i];
- }
- }
- /**
- * 只要max和min相差值小于5,说明肯定可以连续
- * */
- if(max-min<=) return true;
- else return false;
- }/**
- * 解法2:
- * */
- bool DetermineJunko(int *array, int length) {
- /**
- * 使用插入排序对数组进行排序
- * */
- InsertSort(array, , length-);
- /**
- * 计算王的个数,使用king索引,缺省值为-1
- * */
- int king=-;
- for(int i=;i<length;i++) {
- if(array[i]==)
- king++;
- else
- break;
- }
- /**
- * 从king后面一个位置开始,判断current和next索引
- * 的元素是否连续
- * 如果是则current和next向右移动
- * 如果不是则向左移动king表示使用王替换
- * 并且向右移动current和next
- * 如果king已经到-1则失败
- * 如果next已经到达数组末尾则成功
- * */
- int current=king+, next=king+, diff=;
- while(next < length) {
- if(array[current]+==array[next]) {
- current++;next++;
- } if (array[current]==array[next]) {
- return false;
- } else {
- diff=array[next]-array[current];
- for(int i=;i<diff;i++) {
- if(king>-) {
- king--;
- current++;next++;
- } else
- return false;
- }
- }
- }
- return true;
- }
笔试算法题(21):将stack内外颠倒 & 判断扑克牌顺子的更多相关文章
- 前端如何应对笔试算法题?(用node编程)
用nodeJs写算法题 咱们前端使用算法的地方不多,但是为了校招笔试,不得不针对算法题去练习呀! 好不容易下定决心 攻克算法题.发现js并不能像c语言一样自建输入输出流.只能回去学习c语言了吗?其实不 ...
- php笔试算法题:顺时针打印矩阵坐标-蛇形算法
这几天参加面试,本来笔试比较简单,但是在面试的时候,技术面试官说让我现场写一个算法,顺时针打印矩阵的坐标,如图所示 顺序为,0,1,2,3,4,9,14,19,24,23,22,21,20,15,10 ...
- 笔试算法题(56):快速排序实现之非递归实现,最小k值选择(non-recursive version, Minimal Kth Selection of Quick Sort)
议题:快速排序实现之五(非递归实现,短序列优先处理,减少递归栈大小) 分析: 算法原理:此算法实现适用于系统栈空间不足够快速排序递归调用的需求,从而使用非递归实现快速排序算法:使用显示下推栈存储快速排 ...
- 笔试算法题(50):简介 - 广度优先 & 深度优先 & 最小生成树算法
广度优先搜索&深度优先搜索(Breadth First Search & Depth First Search) BFS优缺点: 同一层的所有节点都会加入队列,所以耗用大量空间: 仅能 ...
- 笔试算法题(45):简介 - AC自动机(Aho-Corasick Automation)
议题:AC自动机(Aho-Corasick Automation) 分析: 此算法在1975年产生于贝尔实验室,是著名的多模式匹配算法之一:一个常见的例子就是给定N个单词,给定包含M个字符的文章,要求 ...
- 笔试算法题(24):找出出现次数超过一半的元素 & 二叉树最近公共父节点
出题:数组中有一个数字出现的次数超过了数组长度的一半,请找出这个数字: 分析: 解法1:首先对数组进行排序,时间复杂度为O(NlogN),由于有一个数字出现次数超过了数组的一半,所以如果二分数组的话, ...
- 笔试算法题(06):最大连续子数组和 & 二叉树路径和值
出题:预先输入一个整型数组,数组中有正数也有负数:数组中连续一个或者多个整数组成一个子数组,每个子数组有一个和:求所有子数组中和的最大值,要求时间复杂度O(n): 分析: 时间复杂度为线性表明只允许一 ...
- 笔试算法题(58):二分查找树性能分析(Binary Search Tree Performance Analysis)
议题:二分查找树性能分析(Binary Search Tree Performance Analysis) 分析: 二叉搜索树(Binary Search Tree,BST)是一颗典型的二叉树,同时任 ...
- 笔试算法题(57):基于堆的优先级队列实现和性能分析(Priority Queue based on Heap)
议题:基于堆的优先级队列(最大堆实现) 分析: 堆有序(Heap-Ordered):每个节点的键值大于等于该节点的所有孩子节点中的键值(如果有的话),而堆数据结构的所有节点都按照完全有序二叉树 排.当 ...
随机推荐
- 关于JAVA通过REST接口对arcGis Server数据进行增删改查
一: 添加要素 public void create(BoxVo boxVo) throws Exception { // 创建HTTP客户端 CloseableHttpClient httpclie ...
- hdu4786 Fibonacci Tree (最小生成树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4786 题意:给定图的n个点和m条双向边,告诉你每条边的权值.权值为1表示该边是白边,权值为0表示该边为 ...
- bzoj 1040: [ZJOI2008]骑士【基环树+树形dp】
没考虑可以连着两个不选--直接染色了 实际上是基环森林,对于每棵基环树,dfs找出一个环边,然后断掉这条边,分别对这条边的两端点做一边treedp,取max加进答案里 treedp是设f[u]为选u点 ...
- 51nod 1238 最小公倍数之和 V3 【欧拉函数+杜教筛】
首先题目中给出的代码打错了,少了个等于号,应该是 G=0; for(i=1;i<=N;i++) for(j=1;j<=N;j++) { G = (G + lcm(i,j)) % 10000 ...
- iOS 应用打包 设备兼容性问题(Build Active Architecture Only)
在把应用打包安装到iPod Touch上面时,设备提示不兼容,所以就有几种猜想: 1.CPU架构问题,因为我手里这个iPod Touch的CPU是A5,是32位的: 2.TARGETS里面相关的设置对 ...
- 重置iptables
# reset the default policies in the filter table.iptables -P INPUT ACCEPTiptables -P FORWARD ACCEPTi ...
- 树上最长链 Farthest Nodes in a Tree LightOJ - 1094 && [ZJOI2007]捉迷藏 && 最长链
树上最远点对(树的直径) 做法1:树形dp 最长路一定是经过树上的某一个节点的. 因此: an1[i],an2[i]分别表示一个点向下的最长链和次长链,次长链不存在就设为0:这两者很容易求 an3[i ...
- java数组实现买彩票(重复则重新遍历查询思想)
package com.wh.shuzu; import java.util.Arrays; /** * 买彩票 * @author 丁璐同学 * 重复则重新遍历查询思想 */ public clas ...
- 【Mybatis】环境搭建
SqlMapConfig.xml(MyBatis配置文件) <?xml version="1.0" encoding="UTF-8" ?> < ...
- Java 线程实例 刷碗烧水和倒计时
线程——烧水刷碗和倒计时实例 (一)烧水刷碗 刷碗的同时烧水:下面是碗的程序: 下面是烧水的程序:在水的实现类中,调用了Thread线程,让烧水刷碗同时进行. 注意:刷碗2s一次,烧水10s (二)1 ...