剑指offer
画喜
计算机小白,努力学习
展开
-
面试12:打印1到最大的n位数
1)陷进解法:void Print1ToMaxOfNDigits_1(int n){ int number=1; int i=0; while(i++<n) number*=10; for(i=1;i<number;++i) printf("%d\t",i);}没有规定n的范围,可能溢出,需考虑大数问题2)字符串上模拟加法运算数字最大n位,需要长度为n+原创 2016-09-09 00:32:10 · 319 阅读 · 0 评论 -
面试题40:数组中只出现一次的数字
#include using namespace std;unsigned int FindFirstBitIs1(int num)//从右到左找出第一个为1的位,返回找到的从右到左的下标{ int indexBit=0; while(((num&1)==0)&&(indexBit<8*sizeof(int))) { num=num>>1; ++indexBit; } re原创 2016-11-29 21:08:16 · 304 阅读 · 0 评论 -
面试14:调整数组顺序使奇数位于偶数前面
1)从头扫描数组,碰到偶数拿出,后面数字前挪,这个偶数放在最后每碰到偶数移动O(n),时间复杂度为O(n^2)2)两个指针,第一个指向数组的第一个数字,向后移动,第二个指针指向数组的最后一个数字,它指向数组最后的数字,相遇前,如果第一个指针指向的数字是偶数,第二个指针指向数字是奇数,交换这两个数字void ReorderOddEven(int *pData,unsigned原创 2016-09-13 23:08:53 · 259 阅读 · 0 评论 -
面试1~3剑指offer
面试题1:赋值运算符函数注意点:1)返回值为引用,最后return *this,只有返回一个引用才能连续赋值。2)传入参数为常量引用,减少一次复制构造函数,提高代码效率。const引用防止修改。3)释放实例自身已有内存,防止内存泄露。4)传入参数和当前实例是否为同一实例。同个则不赋值直接返回。同个的话,释放自身内存,传入参数的内存也同时释放。char *data原创 2016-08-25 21:24:57 · 350 阅读 · 0 评论 -
面试30:最小的K个数(top K问题)
解法一:O(n),缺点修改了输入数组void GetLeastNumbers(int* input ,int n,int *output,int k){ if(input==NULL||output==NULL||k>n||n<=0||k<=0) return; int start=0; int end=n-1; int index=Partition(input,n,start原创 2016-09-07 15:29:16 · 370 阅读 · 0 评论 -
和为S的两个数字
题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 输出描述:对应每个测试案例,输出两个数,小的先输出思路:数列满足递增,设两个头尾两个指针i和j,若ai + aj == sum,就是答案(相差越远乘积越小)若ai + aj > sum,aj肯定不是答案之一(前面已转载 2016-10-10 01:34:30 · 376 阅读 · 0 评论 -
反转链表
ListNode* ReverseList(ListNode* pHead){ ListNode* pReversedHead=NULL; ListNode* pNode=pHead; ListNode* pPrev=NULL; while(pNode!=NULL) { ListNode* pNext=pNode->m_pNext; if(pNext==NULL) pRe原创 2016-08-26 18:24:24 · 401 阅读 · 0 评论 -
面试15:链表中倒数第K个结点
思路:两个指针一前一后,相差k-1,当后指针到达最后一个结点时,前一指针正好指向是所求结点ListNode *FindKthToTail(ListNode* pListHead,unsigned int k){ if(pListHead==NULL||k==0) return NULL; ListNode *pAhead=pListHead; ListNode *pBehi原创 2016-09-04 22:58:27 · 240 阅读 · 0 评论 -
面试题37:两个链表的第一个公共结点
题目:输入两个链表,找出它们的第一个公共结点1)蛮力法O(mn)2)利用栈,空间O(m+n)换时间O(m+n),链表入栈,比较栈顶,找最后一个相同的3)求出两个链表的长度,较长的先走两链表差值步,然后同时遍历,找到第一个相同的结点O(m+n)ListNode* FindFirstCommonNode(ListNode* pHead1,ListNode *pHead2){原创 2016-09-06 15:08:00 · 256 阅读 · 0 评论 -
平衡二叉树
题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。bool IsBalanced(TreeNode *root, int & dep){ if(root == NULL){ return true; } int left = 0; int right = 0; if(IsBa原创 2016-09-04 22:19:25 · 194 阅读 · 0 评论 -
面试24:二叉搜索树的后序遍历序列
思路:找根结点,其左子树应小于它的值,右结点大于它的值,然后递归bool VertifySquenceOfBST(int sequence[],int length){ if(sequence==NULL||length<=0) return false; int root=sequence[length-1]; //左子树结点小于根结点 int i=0; for(;i<len原创 2016-09-04 22:03:57 · 195 阅读 · 0 评论 -
树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构){CSDN:CODE:1843166}原创 2016-08-21 19:19:21 · 206 阅读 · 0 评论 -
面试11:数值的整数次方
1)残缺解法:double Power(double base,int exponent){ double result=1.0; for(int i=0;i<=exponent;++i) result*=base; return reslut;}没有考虑输入指数小于1(0或负数)2)底数是零且指数是负数的时候,会对0求倒数导致程序出错 0的0次方是没有意义的原创 2016-09-11 00:31:52 · 245 阅读 · 0 评论 -
面试45:圆圈最后剩下的数字(约瑟夫环)
1)int LastRemaining(unsigned int n,unsigned int m){ if(n<1||m<1) return -1; unsigned int i=0; listnumbers; for(i=0;i<n;++i) numbers.push_back(i); list::iterator current=numbers.begin(); wh原创 2016-08-27 20:46:57 · 513 阅读 · 0 评论 -
面试13:在O(1)时间删除链表结点
O(n)常规:链表开头开始,顺序遍历查找要删除的结点,并在链表删除该结点h的next指向要删除的结点i,h->next指向i的下一结点j,此时删除j保证链表不断开这种方法要找到删除结点的前一结点O(1)把下一结点的内容复制到i,i的指针指向j的下一结点1)删除结点在链表尾部,没有下一结点,只能顺序遍历得到该结点的前序结点,完成删除2)链表只有一个结点删除结点后把原创 2016-08-30 00:55:20 · 360 阅读 · 0 评论 -
面试26:复杂链表的复制
struct ComplexListNode{int m_nValue;Complex:istNode* m_pNext;ComplexListNode*m_pSibling;}1.复制原始链表的每一个结点,并用m_pNext链接;设置每一个结点的m_pSibling指针。但该指针可能指向此结点的前面或后面,需从头定位时间复杂度为O(n^2)2.哈希表存原创 2016-11-17 23:22:01 · 268 阅读 · 0 评论