
编程练习
njudongchen
这个作者很懒,什么都没留下…
展开
-
动态规划练习
什么是动态规划: 1、本质就是利用申请的空间来记录每一个暴力搜索的计算结果,下次要用结果的时候直接使用,而不再进行重复的递归过程 2、动态规划每一中递归状态的计算顺序,依次进行计算。面试中遇到暴力递归题目可以优化成动态规划方法的大体过程: 1、实现暴力递归方法 2、在暴力搜索方法的函数中看那些参数可以代表递归过程 3、找到代表递归过程的参数之后,记忆化搜索的方法非常容易实现。 4、通过分原创 2017-03-02 20:57:44 · 625 阅读 · 0 评论 -
元素最左出现练习
对于一个有序数组arr,再给定一个整数num,请在arr中找到num这个数出现的最左边的位置。 给定一个数组arr及它的大小n,同时给定num。请返回所求位置。若该元素在数组中未出现,请返回-1。 测试样例: [1,2,3,3,4],5,3 返回:2二分查找,中间值等于num之后,保存,并继续向左二分查找。直到最后。 使用迭代的方法实现。class LeftMostAppearance {原创 2017-02-25 17:55:55 · 290 阅读 · 0 评论 -
变态跳台阶
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。这道题借之前青蛙跳台阶的噱头,然而和动态规划一点关系都没有。是一个典型的排列组合问题 其实就是空当插隔板。 总共的选择可以用如下公式进行表示: C0n+C1n+C2n+……+Cnn=2nC_n^0+C_n^1+C_n^2+……+C_n^n=2^n 所以就很简单了。clas原创 2017-03-08 16:58:44 · 227 阅读 · 0 评论 -
循环有序数组最小值练习
对于一个有序循环数组arr,返回arr中的最小值。有序循环数组是指,有序数组左边任意长度的部分放到右边去,右边的部分拿到左边来。比如数组[1,2,3,3,4],是有序循环数组,[4,1,2,3,3]也是。 给定数组arr及它的大小n,请返回最小值。 测试样例: [4,1,2,3,3],5 返回:1对于循环有序数组,如果begin小于end 那么最小值为arr[begin] ,否则判断arr[原创 2017-02-25 22:43:55 · 582 阅读 · 0 评论 -
最左原位
有一个有序数组arr,其中不含有重复元素,请找到满足arr[i]==i条件的最左的位置。如果所有位置上的数都不满足条件,返回-1。 给定有序数组arr及它的大小n,请返回所求值。 测试样例: [-1,0,2,3],4 返回:2首先判断边界条件,如果arr[0]大于n-1,或者arr[n-1]小于0直接返回-1;否则判断中间值,如果arr[m]>m,则查找左半部分,相等和arr[m]小于m查找原创 2017-02-26 00:14:09 · 368 阅读 · 0 评论 -
完全二叉树计数练习
给定一棵完全二叉树的根节点root,返回这棵树的节点个数。如果完全二叉树的节点数为N,请实现时间复杂度低于O(N)的解法。 给定树的根结点root,请返回树的大小。利用到完全二叉树的性质,一定是先有左子树,再有右子树.所以可以利用二分查找的方法计算,首先用求最左子叶求出树高,之后判断右结点的最左子叶是和整颗树的最左子叶在同一层,如果在则树的左子树是满二叉树,否则,右子树是满二叉树,之后迭代即可/*原创 2017-02-26 00:58:18 · 508 阅读 · 0 评论 -
最优编辑练习
对于两个字符串A和B,我们需要进行插入、删除和修改操作将A串变为B串,定义c0,c1,c2分别为三种操作的代价,请设计一个高效算法,求出将A串变为B串所需要的最少代价。给定两个字符串A和B,及它们的长度和三种操作代价,请返回将A串变为B串所需要的最小代价。保证两串长度均小于等于300,且三种代价值均小于等于100。测试样例: “abc”,3,”adc”,3,5,3,100 返回:8经典的二维动态原创 2017-03-04 23:50:29 · 614 阅读 · 0 评论 -
数值的整数次方
题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。注意正负数和0的情况class Solution {public: double Power(double base, int exponent) { int pre=base; double cur;原创 2017-03-08 17:34:43 · 215 阅读 · 0 评论 -
涂色I练习题
要在一个nxm的格子图上涂色,你每次可以选择一个未涂色的格子涂上你开始选定的那种颜色。同时为了美观,我们要求你涂色的格子不能相邻,也就是说,不能有公共边,现在问你,在采取最优策略的情况下,你最多能涂多少个格子?给定格子图的长n和宽m。请返回最多能涂的格子数目。测试样例: 1,2 返回:1暴力破解,疯狂迭代class Paint {public: int getMost(int n, i原创 2017-03-05 14:10:23 · 1254 阅读 · 0 评论 -
快速N次方练习
如果更快的求一个整数k的n次方。如果两个整数相乘并得到结果的时间复杂度为O(1),得到整数k的N次方的过程请实现时间复杂度为O(logN)的方法。 给定k和n,请返回k的n次方,为了防止溢出,请返回结果Mod 1000000007的值。 测试样例: 2,3 返回:8将N用2进制表示,之后可以使用二分搜索的思想简化计算。class QuickPower {public: int ge原创 2017-02-26 15:13:10 · 786 阅读 · 0 评论 -
局部最小值位置练习
定义局部最小的概念。arr长度为1时,arr[0]是局部最小。arr的长度为N(N>1)时,如果arr[0]class Solution {public: int getLessIndex(vector<int> arr) { if(arr.empty()) return -1; if(arr.size()==1)原创 2017-02-25 14:51:33 · 340 阅读 · 0 评论 -
超级素数幂
如果一个数字能表示为p^q(^表示幂运算)且p为一个素数,q为大于1的正整数就称这个数叫做超级素数幂。现在给出一个正整数n,如果n是一个超级素数幂需要找出对应的p,q。 输入描述: 输入一个正整数n(2 ≤ n ≤ 10^18)输出描述: 如果n是一个超级素数幂则输出p,q,以空格分隔,行末无空格。 如果n不是超级素数幂,则输出No输入例子: 27输出例子: 3 3注意2401这种数是原创 2017-03-08 10:54:16 · 714 阅读 · 0 评论 -
台阶问题练习
有n级台阶,一个人每次上一级或者两级,问有多少种走完n级台阶的方法。为了防止溢出,请将结果Mod 1000000007给定一个正整数int n,请返回一个数,代表上楼的方式数。保证n小于等于100000。测试样例: 1 返回:1动态规划届的弱智题 f(n)=f(n-1)+f(n-2);class GoUpstairs {public: int countWays(int n) {原创 2017-03-02 21:46:49 · 884 阅读 · 0 评论 -
矩阵最小路径和练习
有一个矩阵map,它每个格子有一个权值。从左上角的格子开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有的路径中最小的路径和。给定一个矩阵map及它的行数n和列数m,请返回最小路径和。保证行列数均小于等于100.测试样例: [[1,2,3],[1,1,1]],2,3 返回:4这个也不难,对于格子中的每一个点,走到这一个点的最短路径只有两种情况,从上面下原创 2017-03-02 22:08:03 · 1578 阅读 · 0 评论 -
LIS练习
这是一个经典的LIS(即最长上升子序列)问题,请设计一个尽量优的解法求出序列的最长上升子序列的长度。给定一个序列A及它的长度n(长度小于等于500),请返回LIS的长度。测试样例: [1,4,2,5,3],5 返回:3动态规划问题,dp[n]表示已n结尾的最长上升序列,在所有的比A[n]小的位置,找出dp最大的加1就是dp[n]的值。这个思路如果可以想清楚,代码就很简单。class Longes原创 2017-03-02 22:43:47 · 332 阅读 · 0 评论 -
LCS练习
给定两个字符串A和B,返回两个字符串的最长公共子序列的长度。例如,A=”1A2C3D4B56”,B=”B1D23CA45B6A”,”123456”或者”12C4B6”都是最长公共子序列。给定两个字符串A和B,同时给定两个串的长度n和m,请返回最长公共子序列的长度。保证两串长度均小于等于300。测试样例: “1A2C3D4B56”,10,”B1D23CA45B6A”,12 返回:6申请一个数组dp原创 2017-03-03 00:19:21 · 299 阅读 · 0 评论 -
链表判环练习
如何判断一个单链表是否有环?有环的话返回进入环的第一个节点的值,无环的话返回-1。如果链表的长度为N,请做到时间复杂度O(N),额外空间复杂度O(1)。 给定一个单链表的头结点head(注意另一个参数adjust为加密后的数据调整参数,方便数据设置,与本题求解无关),请返回所求值。弗洛伊德判环法,算法证明http://www.cnblogs.com/chengyeliang/p/4454290.h原创 2017-02-23 21:38:08 · 420 阅读 · 0 评论 -
无环单链表判相交练习
现在有两个无环单链表,若两个链表的长度分别为m和n,请设计一个时间复杂度为O(n + m),额外空间复杂度为O(1)的算法,判断这两个链表是否相交。 给定两个链表的头结点headA和headB,请返回一个bool值,代表这两个链表是否相交。保证两个链表长度小于等于500。方法非常简单,如果不考虑返回入口节点可以直接判断两个链表最后一个节点是否相等,如果相等则相交,不相等不相交,如果要返回入口节点,原创 2017-02-24 11:11:55 · 427 阅读 · 0 评论 -
01背包练习
一个背包有一定的承重cap,有N件物品,每件都有自己的价值,记录在数组v中,也都有自己的重量,记录在数组w中,每件物品只能选择要装入背包还是不装入背包,要求在不超过背包承重的前提下,选出物品的总价值最大。给定物品的重量w价值v及物品数n和承重cap。请返回最大总价值。测试样例: [1,2,3],[1,2,3],3,6 返回:6背包问题,dp[i][j]表示从0~i,重量为j时的总价值,有三种情况原创 2017-03-03 16:00:42 · 336 阅读 · 0 评论 -
有环单链表相交判断练习
如何判断两个有环单链表是否相交?相交的话返回第一个相交的节点,不想交的话返回空。如果两个链表长度分别为N和M,请做到时间复杂度O(N+M),额外空间复杂度O(1)。 给定两个链表的头结点head1和head2(注意,另外两个参数adjust0和adjust1用于调整数据,与本题求解无关)。请返回一个bool值代表它们是否相交。有环链表相交,只有两种情况,第一种相交在环之前,另一种相交在环上,首先判原创 2017-02-24 12:07:32 · 349 阅读 · 0 评论 -
单链表相交判断练习
给定两个单链表的头节点head1和head2,如何判断两个链表是否相交?相交的话返回true,不想交的话返回false。 给定两个链表的头结点head1和head2(注意,另外两个参数adjust0和adjust1用于调整数据,与本题求解无关)。请返回一个bool值代表它们是否相交。判断单链表是否有环,有环返回入环节点,无环返回空,若两个链表一个有环一个无环,则不可能相交,否则如果两个都无环则按照原创 2017-02-24 15:34:17 · 302 阅读 · 0 评论 -
递归二叉树的序列打印练习
请用递归方式实现二叉树的先序、中序和后序的遍历打印。 给定一个二叉树的根结点root,请依次返回二叉树的先序,中序和后续遍历(二维数组的形式)。递归方法,灰常简单。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) :原创 2017-02-26 16:51:19 · 419 阅读 · 0 评论 -
赛马练习
作为一个马场的主人,你要安排你的n匹赛马和另一个马场的n匹马比赛。你已经知道了对方马场的出战表,即参加每一场的马的强壮程度。当然你也知道你自己的所有马的强壮程度。我们假定比赛的结果直接由马的强壮程度决定,即更壮的马获胜(若相同则双方均不算获胜),请你设计一个策略,使你能获得尽量多的场次的胜利。给定对方每场比赛的马的强壮程度oppo及你的所有马的强壮程度horses(强壮程度为整数,且数字越大越强壮)原创 2017-03-05 17:22:05 · 531 阅读 · 0 评论 -
复杂链表的复制练习
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。首先题目是要将链表进行复制,但是因为存在random指针,所以不借助辅助结构比较麻烦,下面的算法是空间复杂度为O(1)的方法,首先将每一个节点向后复制一个并连起来,之后再复制random指针,需要注意不能直接复制random指针,因为random指针指向的是正常的节点,需要让random指针指向原创 2017-02-23 11:48:44 · 300 阅读 · 0 评论 -
360笔试题 偶串
题目描述一个字符串S是偶串当且仅当S中的每一个字符都出现了偶数次。如字符串”aabccb”是一个偶串,因为字符a,b,c都出现了两次。而字符串”abbcc”不是偶串,因为字符a出现了一次。 现在给出一个长度为n的字符串T=t1,t2,t3,…,tn。字符串的子串为其中任意连续一段。T长度为1的子串有n个,长度为2的子串有n-1个,以此类推,T一共有n(n+1)/2个子串。给定T,你能算出它有多少个原创 2017-03-25 22:27:47 · 1850 阅读 · 2 评论 -
网易互联网2017,3月笔试题
双核cpu 一种双核CPU的两个核能够同时的处理任务,现在有n个已知数据量的任务需要交给CPU处理,假设已知CPU的每个核1秒可以处理1kb,每个核同时只能处理一项任务。n个任务可以按照任意顺序放入CPU进行处理,现在需要设计一个方案让CPU处理完这批任务所需的时间最少,求这个最小的时间。 输入描述: 输入包括两行: 第一行为整数n(1 ≤ n ≤ 50) 第二行为n个整数length[原创 2017-03-25 23:30:33 · 902 阅读 · 0 评论 -
用KMP算法实现字符串匹配
如果对于一个字符串A,将A的前面任意一部分挪到后边去形成的字符串称为A的旋转词。比如A=”12345”,A的旋转词有12345,23456,34512,45123和51234。对于两个字符串A和B,请判断A和B是否互为旋转词。给定两个字符串A和B及他们的长度lena,lenb,请返回一个bool值,代表他们是否互为旋转词。测试样例:”cdab”,4,”abcd”,4 返回:true小技巧:寻找互为原创 2017-02-10 00:56:58 · 653 阅读 · 0 评论 -
拓扑结构相同子树练习
对于两棵彼此独立的二叉树A和B,请编写一个高效算法,检查A中是否存在一棵子树与B树的拓扑结构完全相同。 给定两棵二叉树的头结点A和B,请返回一个bool值,代表A中是否存在一棵同构于B的子树。这道题目表面上是一个二叉树题目,可以转换为字符串匹配的问题,首先将两个树转换为字符串,遍历这棵树注意在为空的地方加上#!这样可以保证树的唯一性,另外每一个节点后面要跟上#这样可以区分12和1 2这样的节点。之原创 2017-02-13 22:06:07 · 776 阅读 · 0 评论 -
华为fx测试题
1. 小K是X区域的销售经理,他平常常驻“5”城市,并且经常要到“1”、“2”、“3”、“4”、“6”城市出差。当机场出现大雾情况时,会导致对应城市的所有航班的起飞及降落均停止(即不能从该城市出发,其他城市也不能到达该城市)。小K希望知道如果他需要到X城市出差时,如果遇到Y城市出现大雾,他最短的飞行时间及飞行路径。注意:当两个城市间不可达时,消耗时间默认取1000.各城市简的飞行时间如下表所示,加原创 2017-04-23 19:27:35 · 1873 阅读 · 4 评论 -
百度2017实习编程题
[编程题] 寻找三角形 时间限制:1秒 空间限制:32768K 三维空间中有N个点,每个点可能是三种颜色的其中之一,三种颜色分别是红绿蓝,分别用’R’, ‘G’, ‘B’表示。 现在要找出三个点,并组成一个三角形,使得这个三角形的面积最大。 但是三角形必须满足:三个点的颜色要么全部相同,要么全部不同。 输入描述: 首先输入一个正整数N三维坐标系内的点的个数.(N <= 50) 接下原创 2017-04-27 21:43:55 · 3019 阅读 · 0 评论 -
merge-two-sorted-lists
题目描述Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists./** * Definition for singly-linked list. * struct List原创 2017-05-22 10:23:53 · 449 阅读 · 0 评论 -
微软夏令营编程测验第二题MSFT
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Little Ho has a string S consisting of only lowercase letters.All letters in S are distinct except for ‘m’, ‘s’, ‘f’ and ‘t’. Which means the four magical let原创 2017-07-20 11:30:38 · 580 阅读 · 0 评论 -
网易编程题赛马问题
在一条无限长的跑道上,有N匹马在不同的位置上出发开始赛马。当开始赛马比赛后,所有的马开始以自己的速度一直匀速前进。每匹马的速度都不一样,且全部是同样的均匀随机分布。在比赛中当某匹马追上了前面的某匹马时,被追上的马就出局。 请问按以上的规则比赛无限长的时间后,赛道上剩余的马匹数量的数学期望是多少马的速度不同,则一定能由大到小排列。假设是a1>a2>……>an 那么a1在任何位置都可以存活 a2必须在a原创 2017-03-11 13:12:59 · 4561 阅读 · 5 评论 -
网易笔试题,推箱子详解
大家一定玩过“推箱子”这个经典的游戏。具体规则就是在一个N*M的地图上,有1个玩家、1个箱子、1个目的地以及若干障碍,其余是空地。玩家可以往上下左右4个方向移动,但是不能移动出地图或者移动到障碍里去。如果往这个方向移动推到了箱子,箱子也会按这个方向移动一格,当然,箱子也不能被推出地图或推到障碍里。当箱子被推到目的地以后,游戏目标达成。现在告诉你游戏开始是初始的地图布局,请你求出玩家最少需要移动多少步原创 2017-03-11 12:18:25 · 5626 阅读 · 1 评论 -
数组清空练习和游戏练习
现在有一个整数数组,其元素值均为1-n范围内的某个整数,现在你和你的朋友在玩一个游戏,游戏的目的是把数组清空,你们轮流操作,你是先手,每次操作你可以删除数组中值为某个数的元素任意多个(当然数组中值为这个数的元素个数应大于等于你删除的个数,且你至少要删除一个数)。最先把数组清空的人获得胜利。假设你们都采取最优策略,请你计算你能否获得胜利。给定一个整数数组A和元素个数n。请返回一个整数,1代表你能获胜,原创 2017-03-05 19:53:39 · 860 阅读 · 4 评论 -
非递归二叉树的序列打印练习
请用非递归方式实现二叉树的先序、中序和后序的遍历打印。 给定一个二叉树的根结点root,请依次返回二叉树的先序,中序和后续遍历(二维数组的形式)。先序遍历很简单, 1 申请一个新的栈记为sta, 2 将头结点root压入栈中 3 每次从sta中弹出栈顶结点,记为cur,然后打印cur结点的值,如果cur右孩子不为空的话将cur的右孩子先压入sta中,最后如果cur的左孩子不为空的话,将cur原创 2017-02-27 12:33:20 · 362 阅读 · 0 评论 -
二叉树的序列化练习
首先我们介绍二叉树先序序列化的方式,假设序列化的结果字符串为str,初始时str等于空字符串。先序遍历二叉树,如果遇到空节点,就在str的末尾加上“#!”,“#”表示这个节点为空,节点值不存在,当然你也可以用其他的特殊字符,“!”表示一个值的结束。如果遇到不为空的节点,假设节点值为3,就在str的末尾加上“3!”。现在请你实现树的先序序列化。 给定树的根结点root,请返回二叉树序列化后的字符串采原创 2017-02-27 15:52:51 · 425 阅读 · 1 评论 -
二叉树相关概念
平衡二叉树:空树是平衡二叉树如果一棵树不为空,并且其中所有的子树都满足各自左子树和右子树的高度差都不超过1.如何判断是否是平衡二叉树: 头节点是head 进行后序遍历head的左子树是否是平衡二叉树,如果不是,直接返回false;head左子树最深到哪一层,LHhead的右子树是否是平衡二叉树,如果不是,直接返回falsehead右子树最深到哪一层,RH|LH-RH|>1 返回f原创 2017-02-27 17:23:51 · 449 阅读 · 0 评论 -
[编程题]在一个N*N的数组中寻找所有横,竖,左上到右下,右上到左下,四种方向比较
在一个N*N的数组中寻找所有横,竖,左上到右下,右上到左下,四种方向的直线连续D个数字的和里面最大的值输入描述: 每个测试输入包含1个测试用例,第一行包括两个整数 N 和 D : 3 <= N <= 100 1 <= D <= N 接下来有N行,每行N个数字d: 0 <= d <= 100输出描述: 输出一个整数,表示找到的和的最大值输入例子: 4 2 87 98 79 61 10原创 2017-03-06 16:29:51 · 3318 阅读 · 0 评论 -
二叉树重建
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。/** * Definition for binary tree * struct TreeNode { * int val; * TreeN原创 2017-03-07 13:50:23 · 278 阅读 · 0 评论