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总结的更多相关文章

  1. 剑指Offer面试题:1.实现Singleton模式

    说来惭愧,自己在毕业之前就该好好看看<剑指Offer>这本书的,但是各种原因就是没看,也因此错过了很多机会,后悔莫及.但是后悔是没用的,现在趁还有余力,把这本书好好看一遍,并通过C#通通实 ...

  2. 剑指Offer面试题:14.链表的倒数第k个节点

    PS:这是一道出境率极高的题目,记得去年参加校园招聘时我看到了3次,但是每次写的都不完善. 一.题目:链表的倒数第k个节点 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯,本题 ...

  3. 《剑指offer》面试题12:打印1到最大的n位数

    面试题12:打印1到最大的n位数 剑指offer题目12,题目如下 输入数字n,按顺序打印出1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的三位数999 方法一 和面试题11< ...

  4. 《剑指offer》面试题11: 数值的整数次方

    面试题11: 数值的整数次方 剑指offer面试题11,题目如下 实现函数double power(double base,int exponent),求base的exponent次方, 不得使用库 ...

  5. 剑指 Offer 题目汇总索引

    剑指 Offer 总目录:(共50道大题) 1. 赋值运算符函数(或应说复制拷贝函数问题) 2. 实现 Singleton 模式 (C#) 3.二维数组中的查找 4.替换空格              ...

  6. 面试题目——《剑指Offer》

    1.把一个字符串转换成整数——<剑指Offer>P29 2.求链表中的倒数第k个结点——<剑指Offer>P30 3.实现Singleton模式——<剑指Offer> ...

  7. 剑指offer习题集2

    1.把数组排成最小的数 class Solution { public: static bool compare(const string& s1, const string& s2) ...

  8. 剑指offer习题集1

    1.打印二叉树 程序很简单,但是其中犯了一个小错误,死活找不到,写代码要注意啊 这里左右子树,要注意是node->left,结果写成root->left vector<int> ...

  9. 剑指Offer:面试题20——顺时针打印矩阵(java实现)

    题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数 字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1, ...

  10. 牛客网上的剑指offer题目

    题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 题目:请实现一个函数,将一 ...

随机推荐

  1. Ubuntu Server 下的网络配置

    $ ifconfig 配置DHCP客户端$ sudo vi /etc/network/interfaces加入 iface eth0 inet dhcp 配置静态IP地址$ sudo vi /etc/ ...

  2. Hyperic-Sigar简介

    Hyperic-Sigar是一个收集系统各项底层信息的工具集.他有如下特点:1. 收集信息全面收集CPU,MEM,NETWORK,PROCESS,IOSTAT等使用Sigar,你完全可以模仿出cpui ...

  3. SVN版控系统的安装和使用

    SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁移到Subversion ...

  4. mysql数据库binary log中的事件到底是什么?

    需求描述: 最近看mysql备份恢复的时候,基于时间点恢复,提到了binary log中存的是"事件" 那么到底什么是事件呢 概念解释: binary log中存的是事件(even ...

  5. windows命令之PING DIR DEL CD TASKLIST (转)

    最简单的莫过于PING命令了. PING命令的功能就是给对方主机发送IP数据包. 一般都是测试主机是否在线. 用法如下: PING 192.168.1.1.PING命令默认发送的是四个数据包,当然也可 ...

  6. ThreadUtil 多线程处理List,回调处理具体的任务

    每次想多线程处理一个大的结果集的时候 都需要写一大堆代码,自己写了个工具类 方便使用 package com.guige.fss.common.util; import com.guige.fss.c ...

  7. cocos2d-x游戏引擎核心之八——多线程

    一.多线程原理 (1)单线程的尴尬 重新回顾下 Cocos2d-x 的并行机制.引擎内部实现了一个庞大的主循环,在每帧之间更新各个精灵的状态.执行动作.调用定时函数等,这些操作之间可以保证严格独立,互 ...

  8. On iPad, UIImagePickerController must be presented via UIPopoverController

    本文转载至:http://blog.csdn.net/k12104/article/details/8537695 On iPad, UIImagePickerController must be p ...

  9. Java中实现多态的机制(实质)?

    靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象.

  10. js将字符串转换为数字等类型

    1.js提供了parseInt()和parseFloat()两个转换函数. 2.ECMAScript中可用的3种强制类型转换如下:  Boolean(value)——把给定的值转换成Boolean型: ...