剑指offer 解题思路简述总结篇1-10

只记录需要技巧有些许难度的题

  • 面试题3,数组中重复的数字

方法一:排序后从头开始依次比较相邻的两个是否相等,相等即重复,nlogn

方法二:利用新的存储空间set类型,挨个取数据看是否已经存在set中,存在return,不存在add,n

方法三:从头开始遍历num,将每个数的数值x和它的下表i进行比较,不等则将num[i]和num[x]进行比较,相等则return,不相等则交换,交换后仍重复上述过程,直到数值和下表相等,n

  • 面试题4,二维数组中的查找

方法:从右上角的数x开始比较,若需要查找的数大于x,则行数加1,若小,则列数减1

也可以选左下角

  • 面试题5,替换空格

方法:遍历空格的数量,求出字符串变化之后的长度,从字符串的后面开始复制和替换,设置两个指针,一个是变换后的长度的最后p1,一个是字符串的最后p2,当碰到空格,p1处加上替换字符,p2处往前挪一个,当p1和p2只向同一个位置说明可以结束

相似题目:

  • 面试题6,从尾到头打印链表

方法一:从头读取链表,保存在list中,每次指定位置insert新的节点值list.insert(位置,数值)

方法二:用俩个list,一个从头到尾存储值,结束后,pop出每个值到另一个list中

方法三:在方法二前半段的基础上直接调用reverse()或者[::-1]

  • 面试7,重建二叉树

方法:递归,每次从根据前序遍历中的根节点将中序遍历和前序遍历分成两部分,递归处理这两部分

  • 面试题8:二叉树的下一个节点

方法:分情况讨论,如果有右子树的话,找到右子树中的左子叶节点,如果没有的话,找到第一个该节点是其左子节点的节点

  • 面试题9:两个栈实现队列

方法:分别创建两个list,stack1和stack2,append方法直接往stack1中append,delete方法中先判断stack2是否为空,是的话将stack1中的元素全部压到stack2中,输出stack2的栈顶元素

相似问题:两个队列实现栈

方法:分别创建两个list,queue1和queue2,append方法直接往queue1中append,delete方法先 把queue1中的元素放入到queue2中只剩一个元素,弹出该元素,完成后将queue1和queue2互换,以供下一次用

  • 面试题10:斐波那契数列

方法:不要用递归,当n大于2开始,设置m,n两个数,temp=m+n,m=n,n=temp

相似问题:

方法:和斐波那契数列一模一样

方法:1-1,2-2,3个台阶时是2个台阶的2倍,4个台阶的时候是3个台阶的2倍

方法:斐波那契数列