剑指offer总结
1、实现Singleton模式
2、二维数组中的查找:每行从左到右递增,每列从上到下递增,输入一个数,判断数组中是否存在该数
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
如输入7:
小于第4列的9,则不可能在第4列;column--
小于第3列的8,则不可能在第3列;column--
大于第二列的2,则row++;
始终比较右上角的数,相等则返回。(每次查找都会剔除一行或者一列)
3、替换空格:
(移动重复,想办法减少重复,只移动一次!)
遍历一遍字符串char[],得知空格数目,就可知道替换后的字符串长度,用双指针p1 p2来从后往前移动字串
p1在p2的前面,指针同步移动(copy字符过去),但是p1遇到空格,p2就往前2步直到p2遇上p1,空格替换完毕
4、从尾到头部打印链表:(先询问是否可以改变链表结构)
1、不改变:遍历链表,值入栈,遍历结束再值出栈
2、改变:用头插法重建链表,再顺序遍历链表
5、根据前序和中序重建二叉树:Java代码
6、用2个栈实现队列:Java代码
7、旋转数组求最小:
8、求斐波那契数列第n项
递归;直接用公式O(1);递推O(n) 类似双指针 把已经得到的数列项保存起来
9、求二进制中的1的个数:
最优解法:(1100&1011=1000 能去掉最右边的1)
intNumber(int n ){
int count=0;
while(n){
count++;
n=(n-1)&n;
}
}
常规解法:
while(flag){
if(n&flag){
count++;
flag=flag<<1;
}
}
10、数值的整数次方:
要考虑负数(利用正数来求),0,正数
double f(double base,unsigned int e){
if(e==0)return 1;
if(e==1)return base;
double res=f(base,e>>1);
res*=res;
if(e&1==1)res*=base;
return res;
}//细节
12、打印1-n的大数(转化为字符)
13、删除节点O(1) 值覆盖p.data=p.next.data;p.next=p.next.next;
14、调整数组使得奇数位于偶数前面(双指针一前一后 判断奇数p&1==1?)
15、链表中的倒数第k个节点(双指针 注意边界)
16、反转链表 (1)双指针 头插法(2)三个指针pPrev pNode pNext 直接反转链表
17、合并2个排序的链表:
ListNode* Merge(ListNode* pHead1,ListNode* pHead2){
if(pHead1==null)return pHead2;
else if (pHead2==null)return pHead1;
ListNode* pMergedHead=null;
if(pHead1->Value<pHead2->Value){
pMergeHead=pHead1;
pMergeHead->next=Merge(pHead->next,pHead2);
}
else {
pMergeHead=pHead2;
pMergeHead->next=Merge(pHead1,pHead->next);
}
return pMergeHead;
}
18、判断树B是否是树A的子结构
struct BinaryTree{
int Value;
BinaryTree* left;
BinaryTree* right;
};
bool HasSubtee(BinaryTreeNode* pRoot1,BinaryTree* pRoot2){
bool result==false;
if(pRoot1!=null&&pRoot2!=null){
result=DoesTree1HaveTree2(pRoot1,pRoot2);
if(!result)
result=HasSubutree(pRoot1->left,pRoot2);
if(!result)
result=HasSubtree(pRoot1->right,pRoot2);
}
return result;
}
bool DoesTree1HaveTree2(BinaryTreeNode* pRoot1,BinaryTreeNode* pRoot2){
if(pRoot2==null)return true;
if(pRoot1==null)return false;
if(pRoot1->Value!=pRoot2->Value)return false;
return DoesTree1HaveTree2(pRoot1->left,pRoot->left)&&DoesTree1HaveTree2(pRoot1-
>right,pRoot2->right);
}
19、二叉树的镜像:
void MirrorRecursively(BinaryTreeNode* pNode){
if((pNode==null)||(pNode->left==null&&pNode->right))return;
//先写递归代码,再添加退出条件
BinaryTreeNode* pTemp=pNode->left;
pNode->left=pNode->right;
pNode-right=pTemp;
if(pNode->left)MirrorRecursively(pNode->left);
if(pNode-right)MirrorRecursively(pNode-right);
}
20、顺时针打印矩阵
21、包含min函数的栈
2个栈,一个数据栈,一个辅助栈,辅助栈中栈顶始终数据栈的最小元素,若进栈元素大于最小值,则重复加
入
最小值到辅助栈中,因为它是当前最小,若小于最小值,则加入该最小值到辅助栈中(2个栈元素数量始终一致)
22、栈的压入弹出序列(判断第二个序列是否是第一个序列的弹出序列)
如果第二个序列中当前要判断的元素刚好与栈顶元素相等,则直接pop出来,如果不等,则将第一个序列的
后面还没有入栈的元素入栈,直到将与之相等的元素入栈为止,如果第一个序列的所有的元素都入栈了,还没有
找到与之相等的元素,则说明第二个序列不是第一个序列的弹出序列
23、从上往下打印二叉树 队列,逐层遍历
24、二叉搜索树的后续遍历序列
25、二叉树中和为某一值的路径: 栈 先序遍历
26、复杂链表的复制:
(1)A->A'->B->B'...(另一指针A->B)
(2)关键是A'->other=A->other-next;
(3)链表拆分 得到copy的链表
27、二叉搜索树与双向链表 (空)
28、字符串的排列:全排列
29、求数组中出现超过一半的数
(1)基于partition函数的O(n)算法,同快排的partition。会改变数组中数字的位置
(2)在遍历数组的时候,保存2个数字,一个是数组中的数,一个是次数,遍历到下一个数字时,如果和记
录的数字相等,次数+1;如果不同则次数-1;如果次数为0,则保存下一个数字,次数置为1。O(n)
30、最小的k个数
(1)partition函数划分,O(n)
(2)用最大堆作为装这k个数的容器(也可以用红黑树这种数据结构),每次取出最大的数,遍历完n个数
后,得到最小的k个数。O(logk)
(可以先判断k>n/2则求前n-k大)
31、求连续子数组的最大和 动态规划
32、从1到n整数中1出现的次数????
33、把数组排成最小的数(用字符串表示数字,解决大数问题??)
34、丑数?
(1)逐个判断该整数是不是丑数
(2)创建数组保存已经找到的丑数???
35、第一次只出现一次的字符:
(1)扫描一遍字符串 int a[26]; a[字符-'a']++ hash的思想
(2)再次扫描字符串 输出第一个满足 a[字符-'a']==1的字符
36、数组中的逆序对:在数组中的2个数字如果前面一个数字大于后面的数字,则这2个数字组成一个逆序对
(1)暴力解法O(n^2){7 6 5}中有(7,6)(7,5)(6,5)
(2)归并的思想??O(nlogn)
37、2个链表的第一个公共子节点
最高效的解法:遍历链表得到长度m n 大的减小的=a,双指针 长的先走a步,再一起走,逐个判断节点
是否是同一个。O(m+n)
38、数字在排序数组中出现的顺序,二分法O(logn) 一般解法O(n)
39、求二叉树的深度 递归代码最简
拓展:判断一棵树是否是平衡树(任一节点的左右子树的高度差不大于1)后序遍历每个节点只访问一次?
40、数组中只出现一次的数字(有2个这样的数):要求时间O(n) 空间O(1)
(异或:相同数字异或为0,任一数异或0为本身)
假若数组中只有一个数只出现一次,数组中数字逐个异或的结果就是只出现一次的数字;
现在就要想办法,把这2个只出现一次的数分到2个子数组中,就能得到结果。
4异或6=100异或110=010 差别就是在第二个bit位上,所以我们可以把所有数字按这个原则分成2组
4和6一定会被分到不同的组中,相同的数字会被分到同一组中。
41、一个递增排序的数组和一个数s,在数组中查找2个数的和正好是s,输出任一对即可
一般解法是暴力O(n^2) 双指针-首尾指针的解法是O(n)
拓展:打印和为s的连续正数序列 15=1+2+3+4+5=4+5+6=7+8 打印(1 2 3 4 5)(4 5 6)(7 8 )
先形成清晰的解题思路,才能开始写代码;借助上题双指针的思路
最开始:small big 指向1 2 和为3<9 big增大 123 和为6<9 增大big 1234 10>9 增大small
2 3 4 =9 打印 再增大big 2 3 4 5 和14>9 减小small。。。找到4 5 =9
(循环退出条件:small<middle)其中middle=(1+sum)/2;
42、翻转字符串"I am a student."->"student. a am I"
2次翻转 先整个reverse再单个单词reverse
拓展:左旋字符串:输入abcde 2 输出cdeab
先ab->ba cde-> edc 即abcde->baedc
baedc再reverse得到cdeab(注意边界 null)
43、n个色子的点数?
44、扑克牌的顺子?
45、圆圈中剩下的数字:
题目:0 1 2 3 ...n-1这n个数字排成一圈,从0开始每次从这个圆圈中删除第m个数字,求这个圆圈最后剩
下哪个数字?
有名的约瑟夫环问题
46、?求1+2+3+...+n要求不能乘除法、for while if else swith case 条件判断语句
47、不用加减乘除做加法
48、不能被继承的类 java中用final C++中没有,可以把构造函数设为私有
49、字符串转换为整数(自己想好特殊的测试用例)
50、树中2个结点的最低公共祖先(问清楚需求,也许对方是故意漏掉条件考你的思路)
剑指offer总结的更多相关文章
- 剑指Offer面试题:1.实现Singleton模式
说来惭愧,自己在毕业之前就该好好看看<剑指Offer>这本书的,但是各种原因就是没看,也因此错过了很多机会,后悔莫及.但是后悔是没用的,现在趁还有余力,把这本书好好看一遍,并通过C#通通实 ...
- 剑指Offer面试题:14.链表的倒数第k个节点
PS:这是一道出境率极高的题目,记得去年参加校园招聘时我看到了3次,但是每次写的都不完善. 一.题目:链表的倒数第k个节点 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯,本题 ...
- 《剑指offer》面试题12:打印1到最大的n位数
面试题12:打印1到最大的n位数 剑指offer题目12,题目如下 输入数字n,按顺序打印出1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的三位数999 方法一 和面试题11< ...
- 《剑指offer》面试题11: 数值的整数次方
面试题11: 数值的整数次方 剑指offer面试题11,题目如下 实现函数double power(double base,int exponent),求base的exponent次方, 不得使用库 ...
- 剑指 Offer 题目汇总索引
剑指 Offer 总目录:(共50道大题) 1. 赋值运算符函数(或应说复制拷贝函数问题) 2. 实现 Singleton 模式 (C#) 3.二维数组中的查找 4.替换空格 ...
- 面试题目——《剑指Offer》
1.把一个字符串转换成整数——<剑指Offer>P29 2.求链表中的倒数第k个结点——<剑指Offer>P30 3.实现Singleton模式——<剑指Offer> ...
- 剑指offer习题集2
1.把数组排成最小的数 class Solution { public: static bool compare(const string& s1, const string& s2) ...
- 剑指offer习题集1
1.打印二叉树 程序很简单,但是其中犯了一个小错误,死活找不到,写代码要注意啊 这里左右子树,要注意是node->left,结果写成root->left vector<int> ...
- 剑指Offer:面试题20——顺时针打印矩阵(java实现)
题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数 字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1, ...
- 牛客网上的剑指offer题目
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 题目:请实现一个函数,将一 ...
随机推荐
- Oracle Net Manager 服务命名配置以及用PL/SQL 登陆数据库
我们知道,要连接一个数据库需要知道四个参数: 1. 登陆用户名:user: 2. 登录密码:password: 3. 存放数据库的服务器地址(server_ip)和端口(server_port): 4 ...
- linux 删除文件夹及其内容,显示文件路径
比如要删除work文件夹包括里面的内容,则:rm -r /home/ftk/apache-tomcat-5.5.20/work,不管它是文件还是目录都删掉了 知道文件名 要查询文件大概地址用~cd ~ ...
- SharePoint 2010 讨论板列表内容的读取细节处理
list.Folder表示subject,属于特殊列表,使用list.Folder遍历项,而不是使用list.Items;list.Items表示reply;list.Items[0]["P ...
- Oracle RAC:使用 NFS 共享存储时的 mount 选项 总结
oracle rac 使用nfs作为共享存储时,mount的选项有 要求,不能随便设置 grid的要求: rw,bg,hard,nointr,rsize=32768,wsize=32768, ...
- SPP-Net
R-CNN -> SPP-Net -> Fast-RCNN
- js正则表达式的基本语法
1.正则表达式基本语法 创建正则表达式 var re = new RegExp();//RegExp是一个对象,和Aarray一样 //但这样没有任何效果,需要将正则表达式的内容作为字符串传递进去 r ...
- SVN入门 TortoiseSVN 检出
1. SVN检出(SVN Checkout) 检出项目文件. 新建或者进入目录下(比如qianduan1),右键 --> Svn 检出-->其中版本库URL我可以在SVN服务器获取到,将复 ...
- 对于jsp中编码的理解
1.会话都是从客户端也就是浏览器开始发起的,首先用户将地址输入到地址栏中, 当用户输入enter或者点击转到的按钮时,浏览器会根据当前页面的charset对地址栏中的地址进行encode一次,当服务器 ...
- GLSL/C++ 实现滤镜效果
入门效果之浮雕 "浮雕"图象效果是指图像的前景前向凸出背景.常见于一些纪念碑的雕刻上.要实现浮雕事实上很easy.我们把图象的一个象素和左上方的象素进行求差运算.并加上一个灰度.这 ...
- swift--动画效果
一.for循环创建4*4个view,然后对立面的所有view进行动画,这里列集中动画的效果: 1,旋转动画 for tile in backgrounds{ //现将数字块大小职位原始尺寸的1/10 ...