摘要:
map题目:复杂链表的节点信息,除了next的指向以外,还有sibling的指向。请复制该链表。思路:1、可以利用STL中的map容器,存放原始节点和克隆节点的映射关系。这样第二遍遍历原始链表的时候就可以通过该映射关系构建克隆链表的sibling关系。ComplexListCopy 1 cListNode* ComplexListCopy(cListNode* head) 2 { 3 map<cListNode*, cListNode*> map_ori_clone; 4 cListNode* pNode = head; 5 cListNode* CloneHead =... 阅读全文
摘要:
从上向下打印二叉树的每个节点, 同一层的节点按照从左到右的顺序打印。判断一棵树是否是完全二叉树。将一棵完全二叉树层次遍历转化为一个链表。(不用队列)1、思路: 可以使用双端队列deque容器,头负责打印,尾负责接受子节点,直到deque中没有元素为止。 1 void PrintBiTreeBreadth(BiTreeNode* root) 2 { 3 if (root == NULL) return; 4 deque<BiTreeNode*> dequeBiTreeNode; 5 dequeBiTreeNode.push_back(root); 6 while... 阅读全文
摘要:
标准库定义了顺序容器和关联容器,顺序容器内的元素按其位置存储和访问,关联容器内的元素按其键(key)排序。容器只定义了少量的操作,其他大量的操作是通过算法库实现,比如说排序和查找。算法库中的算法没有为每种容器类型设计特定的操作,而是定义了一组泛型算法,通过迭代器在容器上实施。1、顺序容器 顺序容器主要有vector,list,deque;顺序容器适配器主要有stack,queue,priority_queue。 vector和list的区别:vector是可扩展的数组,比array的优越性在于可扩展,但和array一样在内存里是一块连续的区域,支持快速的随机访问。list是双向链表结构... 阅读全文
摘要:
set请写出堆排序的代码。输入n个整数,找出其中最小的k个数。1、思路: 堆排序分为建堆(insertion)和取根数据(delete root)。每一步都涉及到堆调整,堆调整算法的时间复杂度为O(logn)。HeapSort 1 #include <stdio.h> 2 3 #define heap_parent(npos) ((int)(((npos) - 1) / 2)) 4 #define heap_left(npos) ((npos) * 2 + 1) 5 #define heap_right(npos) ((npos) * 2 + 2) 6 7 void Swap(in 阅读全文
摘要:
请在较短的时间内写出归并排序的程序。在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组, 求出该数组中的逆序对的总数。1、思路: 二叉树后序遍历的思想,即先递归排序左右子树,然后才是根节点。时间复杂度O(nlogn),空间复杂度O(n)。MergeSort 1 #include <stdio.h> 2 #include <assert.h> 3 4 void PrintArray(int* data, int length) 5 { 6 for (int i = 0; i < length; i++) 7 printf(&q 阅读全文
摘要:
参考:剑指offer写一个函数,输入n, 求斐波那契数列的第n项。一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个n级的台阶总共有多少种跳法。我们可以用2×1的小矩形横着或竖着去覆盖更大的矩形。请问用8个2×1的小矩形横着或竖着无重复地覆盖一个2×8的大矩形,总共有多少种方法。1、思路: 不建议用递归,因为会重复计算。依次叠加往上计算,动态规划的思想。Fib 1 #include <stdio.h> 2 3 long long Fib(unsigned int n) 4 { 5 int result[2] = {0, 1}; 6 if 阅读全文
摘要:
输入一个字符串, 打印出该字符串中字符的所有排列。举个例子,123的全排列有123、132、213、231、312、321这六种。字符串全排列扩展----八皇后问题1、思路: 递归思路:全排列就是从第一个数起每一个数分别和他后面数做交换。当数组中有出现重复数字时,当出现之前交换过的数字就跳过,只交换不重复的数字。Permutation 1 #include 2 #include 3 4 using namespace std; 5 6 7 //从第一个数开始,分别与后面的数交换 8 void Permutation1(char* pStr, char* pBegin) 9 {10 ... 阅读全文
摘要:
在字符串中找出第一个只出现一次的字符。(35)对公司员工的年龄进行统计排序。计数排序(适用于有边界的数值统计)。1、思路: 因为字符只有256个数字,设置一个hashtable只有256*4=1K字节,这样时间复杂度只有O(n)。 FirstNotRepeatingChar 1 char FirstNotRepeatingChar(char* pString) 2 { 3 if(pString == NULL) 4 return '\0'; 5 6 const int tableSize = 256; 7 unsigned int hashTable... 阅读全文
摘要:
快排的递归版本和非递归版本。数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。(29)输入n个数,找出其中最小的k个数。(30)1、思路: 递归版本:首先随机选定分割数,对数组中小于该分割数的放在左侧,大于该分割数的放在右侧。递归处理左侧和右侧的数字。QuickSort 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <exception> 4 5 void PrintArray(int* data, int length) 6 { 7 for (int i = 0; i < le 阅读全文
摘要:
请快速写出二分查找的代码。把一个数组最开始的若干个元素搬到数组的末尾,叫数组的旋转。输入一个递增排序的数组的一个旋转,输出数组的最小元素。(8)统计一个数字在排序数组中出现的次数。(38)1、思路: 要求输入数组是排序的,这样二分查找的算法是log(n)。BinarySearch 1 int BinarySearch(int data[], int length, int key) 2 { 3 int low, high, mid; 4 low = 0; 5 high = length - 1; 6 while (low <= high) 7 { 8 ... 阅读全文