Skip to content

xiaff/sword-offer-practice

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

55 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

我的《剑指Offer》面试题练习

为 CMyString类型添加赋值运算符函数。

设计一个类,我们只能生成该类的一个实例。

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

请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入“We are happy.”,则输出“We%20are%20happy.”。

输入一个链表的头结点,从尾到头发过来打印出每个结点的值。

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

用两个栈实现一个队列。实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。

现在要求输入一个整数n,请你输出斐波那契(Fibonacci)数列的第n项。
斐波那契数列的定义:
f(0)=0;f(1)=1;
f(n)=f(n-1)+f(n-2)。

请实现一个函数,输入一个函数,输出该数二进制表示中1的个数。 例如把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。

实现函数 double Power(double base, int exponent),求base的exponent次方。 不得使用库函数,同时不需要考虑大数问题。

输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入数字 3,则打印出 1、2、3 ··· 999。

给定单向链表的头指针和某结点指针,实现函数在O(1)时间内删除指定节点。

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分。

输入一个链表,输出该链表中倒数第k个结点。

定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。

输入两个递增排顺序的链表,合并这两个链表并使合并后的链表仍是递增排序的。

输入两棵二叉树A和B,判断B是不是A的子结构。

操作给定的二叉树,将其变换为源二叉树的镜像。

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

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。 在该栈中,调用min、push及pop的时间复杂度都是O(1)。

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。
例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。

从上往下打印出二叉树的每个节点,同层节点从左至右打印。

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果,如果是则返回true,否则返回false。 假设输入的数组的任意两个数字互不相同。

输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。 路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。 在复杂链表中,每个结点除了有一个pNext指针指向下一个结点之外,还有一个pSibling指向链表中的任意结点或者NULL。

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。 要求不能创建任何新的结点,只能调整树中结点指针的指向。

输入一个字符串,打印出该字符串中字符的所有排列。
例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。

输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2, 因此输出为该子数组的和18。

输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。
例如输入12,从1到12这些整数中包含1的数字有1,10,11和12,一共出现了5次。

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

在字符串中找出第一个只出现1次的字符,如输入“abaccdeff”,则输出b。

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。
输入一个数组,求出这个数组中的逆序对的总数。

输入两个链表,找出它们的第一个公共结点。

统计一个数字在排序数组中出现的次数。

输入一棵二叉树,求该树的深度。 从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。

一个整型数组中除了两个数字之外,其他的数字都出现了两次, 写出程序找出这两个只出现了一次的数字,时间复杂度要求O(n),空间复杂度要求O(1)。

输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s,如果有多对数字的和等于s,输出任意一对即可。

  1. 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。 例如输入字符串"I am a student.",则输出"student. a am I"。
  2. 字符串的左旋转操作是把字符串前面的若干字符转移到字符串的后面。请定义一个函数实现字符串左旋转操作的功能, 比如:输入字符串"abcdefg"和数字2,该函数将返回左旋转2位得到的结果"cdefgab"。

把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。 输入n,打印出s的所有可能的值出现的概率。

从扑克牌中随机抽5张牌,判断是不是一个顺子,即这五张牌是不是连续的, 2~10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。

0,1,...n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字,求出这个圆圈里剩下的最后一个数字。

求1+2+3+...+n,要求不能使用乘除法,for,while,if,else,switch,case等关键字及条件判断语句(a?b:c)。

写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

写一个不能被继承的类

将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。

求树中两个结点的最低公共祖先。

About

《剑指Offer》编程练习

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages