笔试算法题(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):每个节点的键值大于等于该节点的所有孩子节点中的键值(如果有的话),而堆数据结构的所有节点都按照完全有序二叉树 排.当 ...
随机推荐
- c语言struct和c++的class的暧昧
c语言风格的封装 数据放在一起,以引用和指针的方式传给行为c++ 认为封装不彻底 1数据和行为分开 对外提供接口 2没有权限设置 看看struct的一个例子 //data.h //c语言风格的封装 数 ...
- mqtt遇到的问题锦集
1.无效客户机标识 (2) Connect指令中的KeepAlive有效范围[60秒,300秒],否则会拒绝连接. 2.消息回调出现频繁的断开连接 待解决 3.长时间消息回调出现 已断开连接 (321 ...
- 理解C++中拷贝构造函数
拷贝构造函数的功能是用一个已有的对象来初始化一个被创建的同样对象,是一种特殊的构造函数,具有一般构造函数的所有特性,当创建一个新对象的时候系统会自动调用它:其形参是本类对象的引用,它的特殊功能是将参数 ...
- 前端基础jQuery
jQury jQuery 是一个 JavaScript 函数库,jQuery 极大地简化了 JavaScript 编程. jQuery库包含以下功能: HTML 元素选取 HTML 元素操作 CSS ...
- ROS学习笔记九:ROS工具
ROS有各种工具可以帮助用户使用ROS.应该指出,这些GUI工具是对输入型命令工具的补充.如果包括ROS用户个人发布的工具,那么ROS工具的数量很庞大.其中,本文讨论的工具是对于ROS编程非常有用的辅 ...
- codeforces 570 D. Tree Requests (dfs)
题目链接: 570 D. Tree Requests 题目描述: 给出一棵树,有n个节点,1号节点为根节点深度为1.每个节点都有一个字母代替,问以结点x为根的子树中高度为h的后代是否能够经过从新排序变 ...
- Exception in thread "main" java.lang.NoClassDefFoundError: org/jaxen/NamespaceContext
使用dom4j的xpath查询节点,报如下错误: Exception in thread "main" java.lang.NoClassDefFoundError: org/ja ...
- Mybatis事务处理
知识点有事务处理的配置,还有事务处理的方法 事务处理的配置: mybatis的事务处理由两种方式控制,JDBC和MANAGED: MANAGED就是说事务处理由第三方的插件来完成,比如说spring ...
- 使用 Java 发送邮件
在我们的应用程序中有时需要给用户发送邮件,例如激活邮件.通知邮件等等.那么如何使用 Java 来给用户发送邮件呢? 使用 java 代码发送邮件 使用工具类发送邮件 使用Spring进行整合发送邮件 ...
- Angular jsonp 同源策略的问题
引用:http://www.cnblogs.com/dengzy/p/5388357.html 说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决 ...