面试题
jack_ooneil
做人如果没有梦想和咸鱼有什么分别?
展开
-
输入一个表示整数的字符串, 把该字符串转换成整数并输出
//把字符串转换成整数//需要考虑正负, 非法数字, 溢出等情况#include #include #include #include #define N 30int my_atoi(const char * str);int main(void){int result;char data[N];char * p = data;原创 2016-07-11 15:29:36 · 4362 阅读 · 0 评论 -
青蛙跳台阶问题
使用01 问题的类似解法解了一下, 可以求出跳台阶的方法, 以及总共的次数., 不过网上搜了一下, 发现原来是用数学归纳法, 推出递归公式, 然后递归求解,以下是01问题的思路的解决方法:#include #include void helper(int data[], int left, int right, int sum);int main原创 2016-07-19 20:42:25 · 402 阅读 · 0 评论 -
左旋转字符串
例如把字符串"abcdef"左旋转2位 变成 "cdefab", 要求时间复杂度 为O(n), 空间复杂度为O(1)如果没有时间复杂度和空间复杂度要求那就非常简单, 有许多办法, 但是要满足题目要求, 方法就相对更少.一. 翻转字符串 3次, 就可以. 比如 首先 翻转 前面 2位, 变成 "bacdef", 再翻转后面4位变成"bafedc", 最后整体翻转, 变成"cdefa原创 2016-07-19 16:59:19 · 285 阅读 · 0 评论 -
在一个字符串中找到第一个只出现一次的字符
首先想到的方法是从第一个字符开始遍历字符, 每个字符在遍历后序字符判断是否有重复的, 没有就说明找到结果, 为了提高效率, 我设置了一个数组用来标记重复的数组.但是还是不如其它博客上看到的效率高.#define N 100char findch(char * str){int i, j;int length = strlen(str);int mark[N] =原创 2016-07-08 15:24:58 · 629 阅读 · 0 评论 -
输入一个整数和一棵二元树,打印出所有和为该整数的二元树中的路径
从根节点到叶子节点经过的所有节点为一个路径.//path 用于保存路径void findPath(BinaryTreeNode * root, int target, int n, int path[]){ if(!root)return ;target -= root->m_nValues;path[n++] = root->m_nValues;if(ta原创 2016-07-07 16:29:45 · 1286 阅读 · 2 评论 -
判断一个数组是不是二元查找树后序遍历的结果
最主要是要知道后序遍历的特点1. 数组最后一个元素为根节点.2. 左子树所有节点在右子树的左边, 需要找出该分界点.//递归实现int isBTreee(int data[], int n){int root;int i;int lLen = 0;int right = 0;int bRet1 = 1, bRet2 = 1;if(n ==原创 2016-07-07 16:21:26 · 641 阅读 · 0 评论 -
输出单向链表倒数第k个节点,倒数第0个指向尾节点.
首先想到的是链表逆序, 然后输出第K个节点.还可以先计算链表中节点个数n, 倒数第0个, 就是顺数第n - 0 -1个.typedef struct ListNode{int m_nKey;struct ListNode * m_pNext;}ListNode;ListNode * retKNode(ListNode * list, in原创 2016-07-07 16:10:02 · 364 阅读 · 0 评论 -
输入一个已经按升序排序过的数组和一个数字
在数组中查找两个数, 使得他们的和正好等于输入的那个数字, 要求时间复杂度为O(n), 如果存在多对这样的数字只需要输出一对就可以.void findarray(int data[], int n, int sum){int left = 0;int right = n -1;while(left {if(data[left] + data[right] =原创 2016-07-07 16:01:40 · 3064 阅读 · 0 评论 -
输入一棵二元查找树, 将该树转换为它的镜像
要求使用递归和循环两种方法.二叉树节点定义:typedef struct BSTreeNode{int m_nValue;struct BSTreeNode * m_pLeft;struct BSTreeNode * m_pRight;}BSTreeNode;一.递归void reverseBTree(BSTreeNode * bst原创 2016-07-07 15:47:45 · 765 阅读 · 0 评论 -
输入两个整数n 和 m, 从数列1, 2, 3, ..., n中随意取几个数, 使其和等于m, 要求将所有组合列出来
本题的关键在随意取几个数, 因此和以前解过的true or false问题思路一样.网上一搜才发现这是一类问题, 称01背包问题我们可以使用递归来列举出所有的排列组合情况,共有2的n次方中情况, 然后筛选其中和为m的排列, 将其打印出来即可.这n个数中, 每一个数都有选取和不选取两种情况, 比如第一个数如果选取, 那么剩余的9 个元素其和应该为m -1, 如果第一个数不选取,原创 2016-07-12 15:43:12 · 1286 阅读 · 0 评论 -
栈的PUSH POP序列
输入两个整数序列, 其中一个表示栈的push顺序, 判断另一个序列有没有可能是对应的POP序列。//下面使用一个栈来模拟这个操作过程, 栈顶元素等于出栈序列中的元素时出栈,不等于时入栈。//如果栈正常POP直到为空,说明序列是对应的POP序列返回真, 否则返回假/*1)pst 为已经初始化的栈2)input为输入栈序列3)output为需要判断的序列4)原创 2016-08-03 10:43:03 · 554 阅读 · 0 评论