随笔分类 - Interview
摘要:如给定数组{1,3,51,5,512,671,9,67},设计程序,输出{9,671,67,512,51,5,3,1}基本思想是给每一位数字定权重,然后使用如W[671] = 6 * w1 + 7 * w2 + 1 * w3;W的个数由数组中位数最长的数字决定。由数组中数字对应的权值来排序即可程序如...
阅读全文
摘要:参考前人的统计思想:分别统计个、十、百、、、亿等第N位上1出现的次数。如ABCDE,在统计D位1出现的次数时,用D做分割符,ABC为Before,E为After。分情况考虑:(n为D的length-1)当D = 0 时,count = Before * 10^n ;当D = 1 时,count = ...
阅读全文
摘要:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18...
阅读全文
摘要:题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。题目简单些,由于是排好序的,可以由两端出发,判断其和与指定数字的大小关系:大了则把较大的变小些,小了则把较小的变大些,相等则符合要求。 1 #include 2 void getTwo(int a[],int length,int sum){ 3 if(length sum) 6 ...
阅读全文
摘要:题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。链表结点定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;};题目不难,能快速想到解决的方法就是定义两个指针,第一个比第二个快k-1个节点。这样,当第一个到达尾节点时,第二个刚好停留在倒数第k个节点上。实现起来的话,就是先让第一个先next k-1个,然后两个再同步next。OKListNode* PrintNext_K(ListNode* L,int k){ if(!L||knext; if(!p1) ...
阅读全文
摘要:题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。程序很简单,就看想到想不到了。悲剧,我属于后者。。。算法的关键就是利用&对变量进行引用,可以直接改变本体,还有就是&&的使用,充分发挥了它作用。即当前者不满足...
阅读全文
摘要:题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。void Reverse(char* Begin,char* End){if(Begin > End) return ;char temp;While(Begin < End){ temp = *Begin; *Begin = *End; *End = temp; Begin++; End--;}}char* WordReverse(char* str){ cha.
阅读全文
摘要:题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:则输出:yes又如输入7、4、6、5 ;因没有对应的二元查找树的后序遍历是次序列,则输出no简单的分析一下这道题:后序遍历也就是说最后的一个节点是根节点,二元查找树又要求它的左子树不大于(或不小于)根节点,右子树不小于(或不大于)根节点。因此,思路也就来了:先把它的根节点拿出来,然后从首元素开始遍历,与根节点比较,直到找出大于根节点的元素来,然后再遍历后面的是否有小于根节点的元素(只考虑左子树不大于根节点,
阅读全文
摘要:题目:输入n个整数,输出其中最小的k个。例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。两种思路,无非就是时间与空间的妥协。限制空间的时候要对原数组进行排序,最好的时间复杂度是O(nlogn),由此可见,当牺牲一部分空间的时候会换来时间复杂度的降低。进而再想到利用一个大小为K的临时数组,来存储K个最小的值,在遍历原数组的同时,更新临时数组里的数据就OK了。那么,现在的问题就是更新临时数组,怎样才能每访问一个数据,都能使临时数组里的数据是最小的K个。自然想到选出临时数组里面的最大值,和原数组里的新访问的值进行比较,判断是否替换最大值。遍历原数组的时间复杂度是O
阅读全文
摘要:题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。如:输入整数25,则输出 10 7 8;10 15输入整数22,则输出 10 7 5思路是运用前序遍历的递归方法,访问这课二叉树,在访问的同时,用一个栈来存放每个节点的数据,这样,当到达叶子节点是就判断其和是不是与输入的整数相等,相等的话就遍历这个栈。解题的难点就是存储路径,一开始的想法是复制节点,构造一个只用到左子树的单链表来存储,不过,感觉这样做下去会很繁琐,所以就换成构造栈来存储数据。这样通过递归的方法来push与pop数据,很般配。要注意的是,下面在构造二
阅读全文
摘要:题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。#include#include#define M 100#define m 10struct minStack{int top;int tail;int *valueStack;int *indexStack;};void InitStack(minStack& s){s.top = 0;s.tail = 0;s.valueStack = (int*)malloc(sizeof(int)*M);s.indexStack = (int*)malloc(siz
阅读全文
摘要:题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。Case1:输入数组:1,-2,3,10,-4,7,2,-5 和最大连续子数组为3,10,-4,7,2 则输出18Case2:输入数组:3,-2,3,10,-4,7,2,-5 和最大连续子数组为3,-2,3,10,-4,7,2 则输出19程序写的比较简单,看了网上的知道自己的缺陷:没有考虑输入为空与和最大为0的区别。。。 #include #include void InitArray(int*& A,int M){ ...
阅读全文
摘要:题目的要求如上图所示测试用例(先构造二叉查找树)void buildBSTreeNode(BSTreeNode* head,int data){node = (BSTreeNode*)malloc(sizeof(BSTreeNode));node->data = data;node->m_Left = NULL;node->m_Right = NULL;BSTreeNode* p = head;while(p){ if(node->data > p->data){ if(!p->m_Right){ p->m_Right = node; ...
阅读全文
摘要:题目的要求很简单,就是输出这样一个蛇形矩阵。。。这道题是在面试亚马逊实习生时遇到的,当初的思路是针对每行元素的增加个数来编程,不过现在来想,按照每行元素增加的话要考虑的因素就太多了,不如这样以元素坐标来思考,来的简单明了。下面以4阶矩阵为例:由上图可得规律:①坐标之和i + j = k - 1;②k为奇数时,i为减,j为增;偶数时,i为增,j为减;③当k n 时,元素坐标以n - 1为起点递减(相应另一坐标递增),元素个数递减;比较难实现的是体现k > n 时的情况,用两个变量完成,一个累计每行元素个数,一个表示元素坐标(当然还有k表示行,count表示元素总个数)#include#in
阅读全文
摘要:Let's assume that there is a simple market for beans. Every day there is a published bean price in the market. Traders can buy or sell at the published price. There is a trader who time travelled to future and brought back the price information for a number of days in the future. If you have thi
阅读全文
浙公网安备 33010602011771号