随笔分类 - 算法
摘要:出题:给定链表的头指针和一个节点指针,要求在O(1)的时间复杂度下删除该节点分析:如果需要删除的节点为A,其前序节点为A-,其后续节点为A+,所以删除A之后,需要使得A-的下一个节点就是A+,常规做法是设法得到A-的索引,需要 从链表头开始遍历所以时间复杂度为O(N),但实际情况是只要保证A-的下一...
阅读全文
摘要:出题:输入一个数组,要求通过交换操作将奇数索引的元素调整到数组前半部分,偶数索引的元素调整到数组后半部分;分析:当然如果没有额外要求的话很容易实现,最好使用In-Place的实现策略;考虑插入排序的策略,不过这里的判断条件是遇到第一个奇数的时候才停止。时间复杂度为O(N^2);另外可以使用快速排序策...
阅读全文
摘要:出题:要求判断二元树的深度(最长根节点到叶节点的路径);分析:二元递归不容易使用循环实现解题: 1 struct Node { 2 int value; 3 Node *left; 4 Node *right; 5 }; 6 /** 7 * 首先考虑...
阅读全文
摘要:出题:输入一个整数N,求从1到N这N个整数的十进制表示中‘1’出现的次数;分析:从左向右处理string表示的数字;当前数字长度为n,判断最左边一位数字字符;如果是0,则直接递归下一位;如果是1,则计数有两个来源,一个是n位数数字(实际就是除去最高位之后的数字大小,加上1,当其余位全部为0的时候),...
阅读全文
摘要:出题:输入一个整数,要求计算此整数的二进制表示中1的个数分析:如果整数表示为k,当其是负数的时候,使用10) {17 /**18 * 此判断条件可以替换为 k&1 == 119 * */20 ...
阅读全文
摘要:出题:反转链表(递归和非递归解法);分析:有递归跟非递归实现,注意对原始链表头节点的处理,因为其他节点都指向下一个节点,其需要指向NULL;解题: 1 struct Node { 2 int v; 3 Node *next; 4 }; 5 Node* NonRecur...
阅读全文
摘要:出题:将输入的表示整数的字符串转变为对应的整数值;分析:每当右边增加一位,说明之前的sum应该高一个数量级,所以*10。由于这两个实现仅仅考虑正规的、正整数输入,所以需要一个Wrapper函数,其功能 主要处理:符号判断(第一个字符是-,+或者直接是数字);非法输入判断(是否有非"012345678...
阅读全文
摘要:出题:Josephus Cycle,约瑟夫环问题。k个数字连成一个环,第一个数字为1。首先从1开始计数删除第m个数字;然后从上次被删除的数字的下一个数字开始计数,删除第m个数字;重复进行第二步直到只剩下一个数字;输出最后剩下的一个数字;分析:解法1:考虑到问题的特殊性,可以使用哑元素表示删除的元素从...
阅读全文
摘要:出题:要求实现层序遍历二元搜索树,并对比BFS与DFS的区别分析:层序遍历也就是由上至下,从左到右的遍历每一层的节点,类似于BFS的策略,使用Queue可以实现,BFS不能用递归实现(由于每一层都需要存储所有节点,所以非常耗用内存)。这段代码主要用于反映BFS与DFS的联系;解题: 1 class...
阅读全文
摘要:出题:输入一个已经升序排序的数组和一个数字;要求在数组中查找两个数,这两个数的和正好等于输入的那个数字,输出任意一对数字就可以,要求时间复杂度是O(n);分析:对于升序排序的数组{…i…j…k…m……},只有可能是i+m=j+k(j和k可能是同一个数),所以可以从两边往中间收缩而忽视其他交叉相加的情...
阅读全文
摘要:出题:输入一个单向链表,要求输出链表中倒数第K个节点分析:利用等差指针,指针A先行K步,然后指针B从链表头与A同步前进,当A到达链表尾时B指向的节点就是倒数第K个节点;解题: 1 struct Node { 2 int v; 3 Node *next; 4 }; 5 ...
阅读全文
摘要:出题:输入一个整数数组,判断该数组是否符合一个二元查找树的后序遍历(给定整数数组,判定其是否满足某二元查找树的后序遍历);分析:利用后序遍历对应到二元查找树的性质(序列最后一个元素必定是根节点,从左向右第一个比根节点大的元素开始直到根节点之前的所有元素必定在右子树,之前的所有元素必定在左子树);解题...
阅读全文
摘要:出题:预先输入一个整型数组,数组中有正数也有负数;数组中连续一个或者多个整数组成一个子数组,每个子数组有一个和;求所有子数组中和的最大值,要求时间复杂度O(n);分析:时间复杂度为线性表明只允许一遍扫描,当然如果最终的最大值为0表明所有元素都是负数,可以用线性时间O(N)查找最大的元素。具体算法策略...
阅读全文
摘要:出题:把二元查找树转变成排序的双向链表。输入一棵二元查找树,要求将该二元查找树按照中序转换成一个排序的双向链表,要求不能创建任何新的节点,只能调整指针的指向;分析:递归的思路,当前节点需要进行的处理,并使用递归调用和返回值将子问题链接起来;首先明白二元查找树的特性,变成有序双向链表后当前根节点的左节...
阅读全文
摘要:出题:请实现给定String的类定义;分析:注意检查标准类构造注意事项;解题: 1 #include 2 #include 3 /** 4 * 检查是否需要构造函数 5 * 检查是否需要无参构造函数 6 * 检查是否需要成员变量(函数)私有 7 * 检查是否需要在构造函数预初始化成员变量...
阅读全文
摘要:出题:输入N个整数,要求输出其中最小的K个数;分析:快速排序和最小堆都可以解决最小(大)K个数的问题(时间复杂度为O(NlogN));另外可以建立大小为K的最大堆,将前K个数不断插入最大堆,对于之后的N-K个数,依次与堆顶元素进行比较,如果新元素更小则删除当前堆顶元素,并更新最大堆;如果新元素大则跳...
阅读全文
摘要:出题:N阶阶乘问题的递归算法和非递归算法;分析:第一种解法:普通暴力解法的实现较为容易;第二种解法:stirling公式可快速给出近似解;解题: 1 int Recursive(int s) { 2 if(1 == s) { 3 return s; 4...
阅读全文
摘要:出题:将字符串“ABCD1234efgh”进行前后对调;分析:常见的考查指针使用的案例,知道字符串长度之后,依次交换位置i以及位置(length-1-i)上的内容,直到重叠;注意不能直接修改指针变量索引的常量字符串;解题: 1 #include 2 #include 3 void reverse...
阅读全文

浙公网安备 33010602011771号