随笔分类 - Interviw 100 problem
摘要:1 /* 2 problem: 输入一个以按升序排列的数组, 和一个数字 3 demand: 在数组中查找两个数, 使得他们的和正好是输入的那个数字, 要求 O(n) 时间复杂度. 如果有多对, 输出一对即可. 4 eg. 1 2 4 7 11 15 输入数字 15, 输出 4 11 5 */ 6 7 #include <iostream> 8 using namespace std; 9 10 void find2Number(int arr[], int n, int dest);11 12 #define N 613 14 int main(void)15 {16 int a
阅读全文
摘要:1 /* 2 Page 50 3 problem: 输入一个单项链表, 输入该链表中倒数第 k 个结点, 倒数第 0 个为尾指针 4 5 */ 6 #include <cassert> 7 #include <iostream> 8 using namespace std; 9 10 class CList {11 typedef struct tagListNode {12 int data;13 tagListNode* pNext;14 }ListNode,* pListNode;15 public:16 CList():m_p...
阅读全文
摘要:1 /* 2 Page 50 3 problem: 1+2+3+……+n 4 demand1: 不能使用 *, /, for, while, if, else, switch, case, ?:. 5 demand2: 不能使用 *, /, +, - 6 7 (1+n)n/2 8 */ 9 10 #include <iostream>11 using namespace std;12 inline void count(int& x, int y, int i);13 14 int counter1(int n);15 int counter2(int n);16 int
阅读全文
摘要:1 /* 2 page 49 3 problem: 求二叉树节点的最大距离 4 demand: 如果我们把二叉树看成一个图, 父子结点之间的连线看成双向的, 姑且定义"距离"为两个节点之间的边的个数. 5 求一棵二叉树中距离最远的两个节点之间的边的个数. 6 7 这个最长的"距离"必然是根的左支的最长分支加上根的右支的最长分支. 或者说, 左支的深度 + 右支的深度 8 abc###d## 3 9 a 10 /\ 11 b d 12 / 13 c 14 abc##...
阅读全文
摘要:1 /* 2 problem: 翻转句子中单词的顺序 3 demand: 输入一个英文句子, 翻转橘子中单词的顺序, 但单词内的顺序不变. 4 */ 5 #include <iostream> 6 using namespace std; 7 8 void reverse_word(char* str); 9 void reverse(char* str, const char end = '\0');10 11 int main(void)12 {13 char str[] = "I am a student.";14 reverse_word
阅读全文
摘要:1 /* 2 problem 9: 判断数组序列是不是二叉查找树的后序遍历结果 3 demand: 输入一个整型数组, 判断该数组是不是某二叉排序树的后序遍历的结果. 4 eg. 5 5 7 6 9 11 10 8 是下面这课二叉树的后序遍历结果, 返回 true 6 8 7 /\ 8 6 10 9 /\ /\10 5 7 9 1111 12 7 4 6 5 没有匹配的树, 返回 false13 14 最后一个数必然是根, 而根的左边的都是小于根的, 根右边的都是大于根的.15 可以将前面的分成两边, 首先从左边找起, 找到第...
阅读全文
摘要:1 /* 2 problem 8: 3 智力题 4 (1), 有两个房间, 一间房有三盏灯, 另一间房有控制着这三盏灯的三个开关, 这两个房间是隔开的, 从一间里不能看到另一间的情况, 要求分别进入两个房间一次, 然后判断出这三盏灯分别是由哪个开关控制的. 5 进入开关的房间, 打开其中两个开关, 让灯发热, 过一会, 关掉其中一盏. 6 进入有灯的房间, 关闭着并发热的, 关闭着不发热的, 开着的, 三种就区分开了. 7 8 (2), 不用乘法或加法增加 8 倍, 7 倍呢 ? 9 n << 3 ; (n << 3) - n; 10 11 (3) BM 简化版本(优.
阅读全文
摘要:1 /* 2 problem 7: 判断一个链表是否有环 3 demand: 返回环的起点 4 */ 5 6 Node* testCyclic(Node* head) { 7 Node *p1,*p2 = head; 8 while ( p2 != NULL && p2->next != NULL) { 9 p1 = head;10 while (p1 != NULL){11 if ( p2->next == p1)12 return p1;13 p1 = p1-...
阅读全文
摘要:1 /*2 problem 6:3 demand:根据上排给出的十个数, 在其下排填出对应的十个数, 要求下排的每个数都是先前上排那个数在下排中出现的次数.4 5 eg. 6 上排数: 0 1 2 3 4 5 6 7 8 97 下排数: 6 2 1 0 0 0 1 0 0 08 9 */
阅读全文
摘要:1 /* 2 problem 5: 查找最小的 k 个元素 3 demand: 输入 n 个整数, 输出其中最小的 k 个数 4 */ 5 #include <cassert> 6 #include <iostream> 7 using namespace std; 8 9 #define MAX_SIZE 102410 #define N 611 12 void printMin(int arr[], int size, int n);13 int findMax(int arr[], int size);14 void print(int arr[], int si
阅读全文
摘要:1 /* 2 problem 4: 在二叉树中找出和为某一个值的所有的路径 3 demand: 输入一个整数和一棵二叉树, 从树的根节点开始往下访问一直到叶子结点所经过的结点形成一条路径. 4 如果这条路径上的权值和等于输入的整数. 则打印出这条路径. 5 6 eg. 输入整数 22 和如下二叉树. 7 10 8 /\ 9 5 1210 / \11 4 712 13 打印出 10 5 7, 10 1214 15 题目来源 blog.csdn.net/v_JULY_v16 */17 #include <iostream>18 using names...
阅读全文
摘要:1 /* 2 problem 3: 求子数组的最大和 3 demand: 输入一个整型数组, 数组中连续的一个或多个整数组成一个子数组, 每个子数组都有一个和, 4 求所有子数组的和的最大值, 以及最大子数组的其实位置和长度, 要求时间复杂度 O(n) 5 eg. 6 1 -2 3 10 -4 7 2 -5 和最大的子数组为 3 10 -4 7 2 7 8 基本思路: 9 max 是最大子数组的和, sum 是大于 0 的一个子数组和 (因为只有大于 0 的和才能增加 max 的值)10 遍历数组, 首先 max = 0x80000000 (int 中最小的值), sum = 0;11 *..
阅读全文
摘要:1 /* 2 problem 2: 设计包含 min 函数的栈 3 demand: 定义栈的数据, 要求添加一个 min 函数, 能够得到栈的最小元素, 并且 min, push, pop 的时间复杂度都是 O(1) 4 5 由于要求 min, push, pop 都是 O(1), 6 首先, 会想到在整个 stack 中保存一个最小值 min, 这是 push 之后求 min 是可以保证 O(1), 可是 pop 之后就无法保证 O(1)了. 7 因为没有记录上一次的最小值. 所以必须在每一 stackElement 中保存一个(当它为 top 的时候的) min 值. 8 题目来源: ..
阅读全文
摘要:1 /* 2 problem 1: 把二元查找树变成排序的双向链表 3 demand: 输入一棵二元查找树, BSTree , 将该树转换成一个排序的双向链表, 4 要求不能创建任何新的结点, 只能调整指针的指向. 5 10 6 / \ 7 6 14 8 / \ / \ 9 4 8 12 16 10 11 4 = 6 = 8 = 10 = 12 = 14 = 16 12 13 题目来源: blog.csdn.net/v_JULY_v/ 14 */ 15 16 struct BSTreeNode {...
阅读全文

浙公网安备 33010602011771号