随笔分类 - 剑指offer
1
主要整理该书籍中的面试题目思想
摘要:题目:写一个函数,求两个整数之和,要求在函数体内不得使用“+、-、*、/”四则运算符号 解题思路:对数字做运算除了四则运算之外,也就只剩下位运算了。位运算是针对二进制的,我们就以二进制再来分析一下前面的三步走策略对二进制是不是也适用。 5的二进制是101,17的二进制是10001.还是试着把计算分成
阅读全文
摘要:题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标垫符号和普通字母一样处理。例如输入字符串“I am a student.”,则输出“student. a am I ”. 解题思路:第一翻转句子中所有的字符。比如翻转“I am a student.”中所有的字符得
阅读全文
摘要:和为S的两个数字 题目一:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于s,输出任意一对即可。 解题思路:首先想到的方法是O(n^2)的方法,也就是先在数组中固定一个数字,再一次判断数组中其余的n-1个数字与它的和是不是等于s,面试官会告诉我们这
阅读全文
摘要:题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 解题思路:没扫描到一个数字的时候,逐个比较该数字和它后面的数字的大小,如果后面的数字比它小,则这两个数字就组成了一个逆序对。假设数组中含有n个数字。由于每个数字都要和O(
阅读全文
摘要:题目:我们把只包含银子2、3和5的数称作丑数。求按从小到大的顺序的第1500个丑数。例如6、8都是丑数,但14不是,因为它包含因子7,习惯上我们把1当作第一个丑数。 解题思路:逐个判断每个整数是不是丑数的解法,直观但不够高效 所谓一个数m是另一个数n的因子,是指n能被m整除,也就是n%m==0。根据
阅读全文
摘要:题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n). 解题思路: 我们试着从头到尾逐个累加示例数组中的每个数字。初始化为0。第一步加上第一个数字1,此时和为1.接下来第二步加上数字-2,和就变成了-1,第三步加上数
阅读全文
摘要:字符串的排列 题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出字符a、b、c所能排列出来的所欲字符串abc、acb、bac、cab和cba. 解题思路: 我们把一个字符串看成由两部分组成:第一部分为它的第一个字符,第二部分是后面的所有字符。过程如下图所示:
阅读全文
摘要:题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是该压栈序列对应的弹出序列,但4、3、5、1、2就不可能是该压栈序列的弹出序列 解题方案: 总结上述入栈、出栈的过
阅读全文
摘要:题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是该压栈序列对应的弹出序列,但4、3、5、1、2就不可能是该压栈序列的弹出序列 解题方案: 总结上述入栈、出栈的过
阅读全文
摘要:题目:二叉树的镜像 请完成一个函数,输入一个二叉树,该函数输出他的镜像。 树的镜像对很多人来说是一个新的概念,如下图所示: 解题步骤: 交换根节点的两个子结点之后,我们注意到值为10,6的结点的子结点仍然保持不变,因此我们还需要交换这两个结点的左右子结点。交换之后的结果分别如下图中的第三棵树和第四棵
阅读全文
摘要:题目:合并两个排序的链表 题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。例如输入图中链表1和链表2,则合并之后的升序链表如链表3所示。 思路解析: 首先分析合并两个链表的过程。我们的分析从合并两个链表的头节点开始。链表1的头结点的值小于链表2的头结点的值,因此链
阅读全文
摘要:题目:输入一个链表,输出该链表中倒数第K个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始他们的值一次是1、2、3、4、5、6.这个链表的倒数第3个结点是值为4的结点。 解题思路:本题中所给的链表是单向链表,单向链表的结点只有从前往
阅读全文
摘要:题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,是的所有奇数位与数组的前半部分,所有偶数位与数组的后半部分。 解题思路: 一般思路:维护两个指针,第一个指针初始化时指向数组的第一个数字,它只向后移动;第二个指针初始化时指向数组的最后一个数字,它只向前移动,在两个指针相遇之前,第一个指针
阅读全文
摘要:定义一个函数,在该函数中可以实现任意两个整数的加法。由于没有限定输入两个数的大小范围,我们也要把它当作大数问题来处理。 如果面试题是关于n位的整数并且没有限定n的取值范围,或者是输入任意大小的整数,那么这个题目很有可能是需要考虑大数问题的。字符串是一个简单、有效的表示大数的方法。 题目:给定单向链表
阅读全文
摘要:链表的结构很简单,它由指针把若干个节点连接成链状结构。由于链表是一种哄抬的数据结构,其操作需要对指针进行操作。因为在船舰链表时,无须知道链表的长度。当插入一个节点时,我们只需要为新节点分配内存,然后调整指针的指向来确保新节点被链接到链表当中。内存分配不是在创建链表时一次性完成的,而是每添加一个节点分
阅读全文
摘要:题目:写一个函数,输入n,求斐波那契数列的第n项。斐波那契数列的定义如下: 解题思路: 面试官期待的使用解法,我们可以把已经得到的数列中间项保存起来,如果下次需要计算的时候我们先查找一下,如果前面已经计算过就不用再重复计算了。 更简单的办法时从下往上计算,首先根据f(0)和f(1)算出f(2),再根
阅读全文
摘要:栈的特点是后进先出,即最后别呀如栈的元素会第一个被弹出(pop)。 队列是另外一个很重要的数据结构。和栈不同的是,队列的特点是先进先出,即第一个进入队列的元素将会第一个出来。 题目:用两个栈是新啊一个队列。队列的声明那个如下,请实现它的两个函数apeendTail和deleteHead,分别完成在对
阅读全文
摘要:树是一种在实际编程中经常遇到的数据结构。他的逻辑很简单:除了根接待你之外每个节点中有一个父节点,根节点没有父节点;除了叶节点之外所有节点都有一个或多个子节点,叶节点没有子节点。父节点和子节点之间用指针链接。 二叉树的遍历方式: 前序遍历:先访问根节点,再访问左子节点,最后访问右子节点。 下图的前序遍
阅读全文
摘要:题目:请实现一个函数,把字符串中的每个空格替换成“%20”.例如输入“we are happy.”,则输出“we%20are%20happy.”. 解题思想:在网络编程中,如果URL参数中含有特殊字符,如空格、“#”等,可能导致服务器端无法获得正确的参数值。我们需要将这些特殊符号转换成服务器可以识别
阅读全文
摘要:题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中手否含有该整数。 解答思想:首先选取数组中右上角的数字。如果该数字等于要查找的数字,查找过程结束;如果该数字大于要查找的数字,剔除这个数字所在的
阅读全文
1

浙公网安备 33010602011771号