出题:要求用递归将一个栈结构的元素内外颠倒;

分析:

  • 本题再次说明系统栈是程序员最好的帮手,但递归度较高所以时间复杂度较大,可以使用空间换时间的方法(额外数组保存栈元素,然后逆向压入);
  • 第一层递归(清空栈元素,并使用系统栈保存):[1,2,3,4,5],栈顶元素为1,将1弹出之后,递归处理[2,3,4,5];
  • 第二层递归(将栈顶元素插入到栈底,同样使用系统栈保存):当[2,3,4,5]已经逆序之后,需要将1插入到栈底,所以将1作为参数传递到递归调用中,之后递归处理2和[3,4,5];

解题:

  1. class MyStack {
  2. private:
  3. int *array;
  4. int capability;
  5. int top;
  6. public:
  7. MyStack(int cap=): array((int*)malloc(sizeof(int)*cap)), capability(cap), top() {}
  8. ~MyStack() {delete [] array;}
  9.  
  10. bool isFull() {
  11. return top == capability;
  12. }
  13. bool isEmpty() {
  14. return top == ;
  15. }
  16. int freeSlot() {
  17. return capability - top;
  18. }
  19. /**
  20. * top当前的位置就是下一个push元素所在的slot
  21. * */
  22. bool push(int n) {
  23. if(isFull()) return false;
  24. array[top++]=n;
  25. return true;
  26. }
  27. bool pop(int *n) {
  28. if(isEmpty()) return false;
  29. *n=array[--top];
  30. return true;
  31. }
  32. void ShowStack() {
  33. int temp=top-;
  34. printf("\n");
  35. for(int i=;i<=temp;i++)
  36. printf("%d, ",array[i]);
  37. printf("\n");
  38. }
  39. };
  40. void AddToBottom(MyStack *stack, int top) {
  41. int curTop;
  42. if(stack->pop(&curTop)) {
  43. AddToBottom(stack, top);
  44. stack->push(curTop);
  45. }else
  46. stack->push(curTop);
  47. }
  48. void ReverseStack(MyStack *stack) {
  49. int top;
  50. if(stack->pop(&top)) {
  51. ReverseStack(stack);
  52. AddToBottom(stack, top);
  53. }
  54. }

出题:从扑克牌中随机抽出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. /**
  2. * 解法1:
  3. * */
  4. bool BetterVersion(int *array, int length) {
  5. int hash[];
  6. int max=array[],min=array[];
  7. /**
  8. * 使用一个14个元素的int数组表示13个数字和王(0)
  9. * 全部初始化为0
  10. * */
  11. for(int i=;i<;i++)
  12. hash[i]=;
  13.  
  14. for(int i=;i<length;i++) {
  15. if(array[i]==)
  16. hash[]++;
  17. else {
  18. /**
  19. * max和min仅在1到13之间统计
  20. * 并且一旦某个数字出现两次,则失败
  21. * */
  22. if(hash[array[i == )
  23. hash[array[i]=;
  24. else
  25. return false;
  26. if(array[i]>max) max=array[i];
  27. if(array[i]<min) min=array[i];
  28. }
  29. }
  30. /**
  31. * 只要max和min相差值小于5,说明肯定可以连续
  32. * */
  33. if(max-min<=) return true;
  34. else return false;
  35. }/**
  36. * 解法2:
  37. * */
  38. bool DetermineJunko(int *array, int length) {
  39. /**
  40. * 使用插入排序对数组进行排序
  41. * */
  42. InsertSort(array, , length-);
  43. /**
  44. * 计算王的个数,使用king索引,缺省值为-1
  45. * */
  46. int king=-;
  47. for(int i=;i<length;i++) {
  48. if(array[i]==)
  49. king++;
  50. else
  51. break;
  52. }
  53. /**
  54. * 从king后面一个位置开始,判断current和next索引
  55. * 的元素是否连续
  56. * 如果是则current和next向右移动
  57. * 如果不是则向左移动king表示使用王替换
  58. * 并且向右移动current和next
  59. * 如果king已经到-1则失败
  60. * 如果next已经到达数组末尾则成功
  61. * */
  62. int current=king+, next=king+, diff=;
  63. while(next < length) {
  64. if(array[current]+==array[next]) {
  65. current++;next++;
  66. } if (array[current]==array[next]) {
  67. return false;
  68. } else {
  69. diff=array[next]-array[current];
  70. for(int i=;i<diff;i++) {
  71. if(king>-) {
  72. king--;
  73. current++;next++;
  74. } else
  75. return false;
  76. }
  77. }
  78. }
  79. return true;
  80. }

笔试算法题(21):将stack内外颠倒 & 判断扑克牌顺子的更多相关文章

  1. 前端如何应对笔试算法题?(用node编程)

    用nodeJs写算法题 咱们前端使用算法的地方不多,但是为了校招笔试,不得不针对算法题去练习呀! 好不容易下定决心 攻克算法题.发现js并不能像c语言一样自建输入输出流.只能回去学习c语言了吗?其实不 ...

  2. php笔试算法题:顺时针打印矩阵坐标-蛇形算法

    这几天参加面试,本来笔试比较简单,但是在面试的时候,技术面试官说让我现场写一个算法,顺时针打印矩阵的坐标,如图所示 顺序为,0,1,2,3,4,9,14,19,24,23,22,21,20,15,10 ...

  3. 笔试算法题(56):快速排序实现之非递归实现,最小k值选择(non-recursive version, Minimal Kth Selection of Quick Sort)

    议题:快速排序实现之五(非递归实现,短序列优先处理,减少递归栈大小) 分析: 算法原理:此算法实现适用于系统栈空间不足够快速排序递归调用的需求,从而使用非递归实现快速排序算法:使用显示下推栈存储快速排 ...

  4. 笔试算法题(50):简介 - 广度优先 & 深度优先 & 最小生成树算法

    广度优先搜索&深度优先搜索(Breadth First Search & Depth First Search) BFS优缺点: 同一层的所有节点都会加入队列,所以耗用大量空间: 仅能 ...

  5. 笔试算法题(45):简介 - AC自动机(Aho-Corasick Automation)

    议题:AC自动机(Aho-Corasick Automation) 分析: 此算法在1975年产生于贝尔实验室,是著名的多模式匹配算法之一:一个常见的例子就是给定N个单词,给定包含M个字符的文章,要求 ...

  6. 笔试算法题(24):找出出现次数超过一半的元素 & 二叉树最近公共父节点

    出题:数组中有一个数字出现的次数超过了数组长度的一半,请找出这个数字: 分析: 解法1:首先对数组进行排序,时间复杂度为O(NlogN),由于有一个数字出现次数超过了数组的一半,所以如果二分数组的话, ...

  7. 笔试算法题(06):最大连续子数组和 & 二叉树路径和值

    出题:预先输入一个整型数组,数组中有正数也有负数:数组中连续一个或者多个整数组成一个子数组,每个子数组有一个和:求所有子数组中和的最大值,要求时间复杂度O(n): 分析: 时间复杂度为线性表明只允许一 ...

  8. 笔试算法题(58):二分查找树性能分析(Binary Search Tree Performance Analysis)

    议题:二分查找树性能分析(Binary Search Tree Performance Analysis) 分析: 二叉搜索树(Binary Search Tree,BST)是一颗典型的二叉树,同时任 ...

  9. 笔试算法题(57):基于堆的优先级队列实现和性能分析(Priority Queue based on Heap)

    议题:基于堆的优先级队列(最大堆实现) 分析: 堆有序(Heap-Ordered):每个节点的键值大于等于该节点的所有孩子节点中的键值(如果有的话),而堆数据结构的所有节点都按照完全有序二叉树 排.当 ...

随机推荐

  1. 关于JAVA通过REST接口对arcGis Server数据进行增删改查

    一: 添加要素 public void create(BoxVo boxVo) throws Exception { // 创建HTTP客户端 CloseableHttpClient httpclie ...

  2. hdu4786 Fibonacci Tree (最小生成树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4786 题意:给定图的n个点和m条双向边,告诉你每条边的权值.权值为1表示该边是白边,权值为0表示该边为 ...

  3. bzoj 1040: [ZJOI2008]骑士【基环树+树形dp】

    没考虑可以连着两个不选--直接染色了 实际上是基环森林,对于每棵基环树,dfs找出一个环边,然后断掉这条边,分别对这条边的两端点做一边treedp,取max加进答案里 treedp是设f[u]为选u点 ...

  4. 51nod 1238 最小公倍数之和 V3 【欧拉函数+杜教筛】

    首先题目中给出的代码打错了,少了个等于号,应该是 G=0; for(i=1;i<=N;i++) for(j=1;j<=N;j++) { G = (G + lcm(i,j)) % 10000 ...

  5. iOS 应用打包 设备兼容性问题(Build Active Architecture Only)

    在把应用打包安装到iPod Touch上面时,设备提示不兼容,所以就有几种猜想: 1.CPU架构问题,因为我手里这个iPod Touch的CPU是A5,是32位的: 2.TARGETS里面相关的设置对 ...

  6. 重置iptables

    # reset the default policies in the filter table.iptables -P INPUT ACCEPTiptables -P FORWARD ACCEPTi ...

  7. 树上最长链 Farthest Nodes in a Tree LightOJ - 1094 && [ZJOI2007]捉迷藏 && 最长链

    树上最远点对(树的直径) 做法1:树形dp 最长路一定是经过树上的某一个节点的. 因此: an1[i],an2[i]分别表示一个点向下的最长链和次长链,次长链不存在就设为0:这两者很容易求 an3[i ...

  8. java数组实现买彩票(重复则重新遍历查询思想)

    package com.wh.shuzu; import java.util.Arrays; /** * 买彩票 * @author 丁璐同学 * 重复则重新遍历查询思想 */ public clas ...

  9. 【Mybatis】环境搭建

    SqlMapConfig.xml(MyBatis配置文件) <?xml version="1.0" encoding="UTF-8" ?> < ...

  10. Java 线程实例 刷碗烧水和倒计时

    线程——烧水刷碗和倒计时实例 (一)烧水刷碗 刷碗的同时烧水:下面是碗的程序: 下面是烧水的程序:在水的实现类中,调用了Thread线程,让烧水刷碗同时进行. 注意:刷碗2s一次,烧水10s (二)1 ...