
面试题
yang20141109
这个作者很懒,什么都没留下…
展开
-
炮弹攻击
兰博教训提莫之后,然后和提莫讨论起约德尔人,谈起约德尔人,自然少不了一个人,那 就是黑默丁格------约德尔人历史上最伟大的科学家. 提莫说,黑默丁格最近在思考一个问题:黑默丁格有三个炮台,炮台能攻击到距离它R的敌人 (两点之间的距离为两点连续的距离,例如(3,0),(0,4)之间的距离是5),如果一个炮台能攻击 到敌人,那么就会对敌人造成1×的伤害.黑默丁格将三个炮台放在N*M方格中的点上,并原创 2016-03-19 16:55:26 · 476 阅读 · 1 评论 -
逆波兰表达式求值
给出一个逆波兰表达式,求该逆波兰表达式表达式的值。比如: ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9 ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6 解析:用栈来实现,遍历当前字符串,如果当前字符串可以转换为数组类型,则当前元素转换为数值,并且入栈,如果是运算原创 2016-04-22 22:33:48 · 642 阅读 · 0 评论 -
leetcode 12 Integer to Roman(整型数转换为罗马数字)
罗马数字采用七个罗马字母作数字、即Ⅰ(1)、X(10)、C(100)、M(1000)、V(5)、L(50)、D(500),比如说IX(4),CCCXLV(345)。我们把1到3999数字转换为罗马数字。代码如下:string intToRoman(int num){ string M[] = { "", "M", "MM", "MMM" }; string C[] = { "", "C",原创 2016-07-23 20:44:34 · 403 阅读 · 0 评论 -
leetcode 13 Roman to Integer(罗马数字转换为整数)
把给定罗马数字转换为整型数字。int romanToInt(string s) { int res = 0; for (int i = 0; i < s.size(); ++i) { if (s[i] == 'I') { if (s[i + 1] == 'V') { res += 4; i++; } else if (s[i + 1] ==原创 2016-07-23 20:56:15 · 387 阅读 · 0 评论 -
集合中的子集(三种方法)
给定一个集合,求出这个集合的所有子集,比如:集合{1,2,3},子集为{},{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3}。 解法一:递归void subsets(vector> &res, vector &path,vector &nums, int start){ res.push_back(path); for (int i = start; i原创 2016-07-01 11:46:46 · 3282 阅读 · 0 评论 -
集合中的子集2(含有重复元素)
给定一个集合,含有重复元素,求这个集合的子集,例如:集合{1,2,2},子集为{},{1},{2},{1,2},{2,2},{1,2,2}。 解法一:递归void subsetsWithDup(vector> &res, vector &path,vector &nums, int start){ res.push_back(path); for (int i = start; i原创 2016-07-01 17:33:38 · 824 阅读 · 0 评论 -
调整数组使得奇数元素位于偶数元素之前(相对位置不变)
调整数组,使得奇数元素位于偶数元素之前,且相对顺序不变。解析:冒泡排序思想,比较当前元素和下一个元素,如果当前元素是偶数且下一个元素为奇数,交换这两个数。每次冒泡都会使得最后一个偶数在正确的位置。void reOrderArray(vector &nums) { int size = nums.size(); for (int i = 0; i < size - 1; ++i) {原创 2016-07-14 17:21:18 · 1442 阅读 · 0 评论 -
栈的压入和弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的) 解析:使用辅助栈,压入序列中元素依次入栈,每次入栈时,判断当前栈顶元素是否和弹出序列中元素原创 2016-07-14 21:15:36 · 387 阅读 · 0 评论 -
不使用加减乘除做两个数加法
题目:不使用加减乘除做两个数的加法,比如num1=4和num2=5,两个数做完加法以后为9。 解析:因为不能使用四则运算,我们可以考虑使用位操作。首先:计算num1和num2异或。然后:计算两个数的与操作并且向左移动一位。两步分别计算出二进制中相同位为1和相同位一个为一另一个为零的情况。int Add(int num1, int num2){ int sum = num1; whi原创 2016-07-19 16:32:11 · 446 阅读 · 0 评论 -
已知圆的半径和弧长求弧的终点坐标(360春招跑步编程题)
小明同学喜欢体育锻炼,他常常去操场上跑步。跑道是一个圆形,在本题中,我们认为跑道是一个半径为R的圆形,设圆心的坐标为原点(0,0)。小明跑步的起点坐标为(R,0),他沿着圆形跑道跑步,而且一直沿着一个方向跑步。回到家后,他查看了自己的计步器,计步器显示他跑步的总路程为L。小明想知道自己结束跑步时的坐标,但是他忘记自己是沿着顺时针方向还是逆时针方向跑的了。他想知道在这两种情况下的答案分别是多原创 2017-03-18 22:12:12 · 3205 阅读 · 0 评论 -
矩阵中从左上角到右下角的路径条数
题目:给定一个n*m矩阵,求从左上角到右下角总共存在多少条路径,每次只能向右走或者向下走。解法一:和上一篇文章的思想相似,在此不再重复叙述。int uniquePaths(int m, int n) { if (m <= 0 || n <= 0) return 0; vector data(n,1); int cur = 0; for(int i = 1; i < m; ++i)原创 2016-05-31 11:53:38 · 11079 阅读 · 0 评论 -
链表进行插入排序
插入排序:在已排好序的序列中,找到当前要排序元素的插入位置即可。如果我们对链表进行排序,我们只需要找到当前插入位置的前一个指针即可。然后当前元素向前移动一位。//对单向链表进行快速排序#include#includeusing namespace std;//链表数据结构struct ListNode{ int val; ListNode *next;};//在链表末尾追加原创 2016-04-22 22:05:19 · 2012 阅读 · 0 评论 -
leetcode 1 Two Sum(在无序数组中找两个数之和与目标值相等,两种方法)
Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would have exactly one solution.Example: Given nums原创 2016-05-28 09:26:51 · 3036 阅读 · 0 评论 -
搬圆桌问题
现在有一张半径为r的圆桌,其中心位于(x,y),现在他想把圆桌的中心移到(x1,y1)。每次移动一步,都必须在圆桌边缘固定一个点然后将圆桌绕这个点旋转。问最少需要移动几步。输入描述:一行五个整数r,x,y,x1,y1(1≤r≤100000,-100000≤x,y,x1,y1≤100000)输出描述:输出一个整数,表示答案输入例子:2 0 0 0 4输出例子:1解原创 2016-03-19 21:52:36 · 1124 阅读 · 1 评论 -
最大间隔
给定一个递增序列,a1 <a2 <...<an 。定义这个序列的最大间隔为d=max{ai+1 - ai }(1≤i<n),现在要从a2 ,a3 ..an-1 中删除一个元素。问剩余序列的最大间隔最小是多少?输入描述:第一行,一个正整数n(1<=n<=100),序列长度;接下来n个小于1000的正整数,表示一个递增序列。输出描述:输出答案。输入例子:51 2原创 2016-03-19 22:07:42 · 652 阅读 · 1 评论 -
数组中的最大差值
有一个长为n的数组A,求满足0≤a≤b给定数组A及它的大小n,请返回最大差值。解析:贪心思想,时间复杂度为o(n)。设置当前数组中的最小值为min_value。初始化为arr[0],然后依次遍历数组中的每一个元素,当遍历到一个元素时求出当前元素与之前的min_value差值,用该差值和当前最大的差值相比较,如果该差值大于当前最大差值,则更新当前最大差值。然后用该元素和当前最小的元素相比较。如果原创 2016-03-26 21:49:10 · 4843 阅读 · 0 评论 -
字符串中第一次出现的字符
题目:在字符串中查找出第一个只出现一次的字符。如输入"abaccdeff",则输出b所在的下标。方法一:时间复杂度为o(n*n)。遍历字符串中的每个字符,然后用该字符在字符串中进行查找,如果没有找到和当前字符相同的字符。则当前字符为第一个 只出现一次的字符。int firstNotRepeatingChar(string str){ if (str.empty()) return -1原创 2016-03-27 09:25:12 · 2467 阅读 · 0 评论 -
数组中只出现一次的两个数字
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 方法一:时间复杂度为o(n*n)。扫描数组中的每个元素,查看该元素在数组中出现的次数。直到找到两个出现一次的数字为止。 方法二:时间复杂度为o(n)。扫描两遍数组即可。第一遍扫描时,对数组中的每个元素作异或操作。最终结果存储在变量val。val值和两个只出现一次的数字的异或结果相同。然原创 2016-03-27 11:18:24 · 408 阅读 · 0 评论 -
x或y等于x加y
给定 x, k ,求满足 x + y = x | y 的第 k 小的正整数 y 。 | 是二进制的或(or)运算,例如 3 | 5 = 7。比如当 x=5,k=1时返回 2,因为5+1=6 不等于 5|1=5,而 5+2=7 等于 5 | 2 = 7。 暴力枚举法:我们从1遍历到最大的长整型数(long long),求出满足要求的第k小的数。时间复杂度过于庞大。代码如下:int theN原创 2016-04-29 20:57:36 · 2473 阅读 · 0 评论 -
最大映射
有 n 个字符串,每个字符串都是由 A-J 的大写字符构成。现在你将每个字符映射为一个 0-9 的数字,不同字符映射为不同的数字。这样每个字符串就可以看做一个整数,唯一的要求是这些整数必须是正整数且它们的字符串不能有前导零。现在问你怎样映射字符才能使得这些字符串表示的整数之和最大? 输入描述:每组测试用例仅包含一组数据,每组数据第一行为一个正整数 n , 接下来有 n 行,每行一个长度不原创 2016-04-29 22:04:06 · 2965 阅读 · 4 评论 -
顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如:如果输入的矩阵如下图所示:则顺时针打印的序列为:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10。 解析:我们可以一圈一圈的打印矩阵,要一圈一圈的打印矩阵,必须获得圈的边界:圈的起始行和终止行,以及圈的起始列和终止列。打印的结束条件是:(1)起始行和终止行相同。(2)起始列和终止原创 2016-05-25 21:34:25 · 397 阅读 · 0 评论 -
顺时针九十度旋转矩阵(两种方法)
题目:给定一个n*n的矩阵,顺时针把矩阵旋转90度。比如说{{1,2,3}{4,5,6}{7,8,9}}。顺时针旋转90度为{{7,4,1}{8,5,2}{9,6,3}}。 解法一:时间复杂度为o(n*n),空间复杂度为o(n)。步骤:(1)把矩阵的行当做一个整体,逆序矩阵中的行,也就是说把matrix[i]行和matrix[len - i]进行交换。(2)在交换后的矩阵中,按照对角原创 2016-05-27 21:37:27 · 24981 阅读 · 0 评论 -
栈中元素排序
栈中元素排序:题目:一个栈中元素类型为整型,现在想将栈顶到栈底从大到小排序。要求:只能申请一个栈,但可以申请新的变量,不能申请额外的数据结构,如何完成排序。解析:将要排序的栈记为s,申请的辅助栈记为t,在栈s上执行pop操作,弹出的元素为cur,每次弹出一个元素时,分两种情况:情况一:如果cur小于或等于t中的栈顶元素,则将cur元素直接压入栈t中。情况二:如果cur大于t中的原创 2017-09-17 13:40:49 · 1801 阅读 · 0 评论