程序员面试金典84题之每日7题 - 第七天

第一题:集合的子集

题目:

请编写一个方法,返回某集合的所有非空子集。

给定一个int数组A和数组的大小int
n,请返回A的所有非空子集。保证A的元素个数小于等于20,且元素互异。各子集内部从大到小排序,子集之间字典逆序排序,见样例。

测试样例:

[123,456,789]
返回:{[789,456,123],[789,456],[789,123],[789],[456
123],[456],[123]}

解析:

第二题:字符串排列

题目:

编写一个方法,确定某字符串的所有排列组合。

给定一个string A和一个int
n,代表字符串和其长度,请返回所有该字符串字符的排列,保证字符串长度小于等于11且字符串中字符均为大写英文字符,排列中的字符串按字典序从大到小排序。(不合并重复字符串)

测试样例:

“ABC”

返回:

[“CBA”,“CAB”,“BCA”,“BAC”,“ACB”,“ABC”]

解析:

第三题:合法括号序列判断

题目:

对于一个字符串,请设计一个算法,判断其是否为一个合法的括号串。

给定一个字符串A和它的长度n,请返回一个bool值代表它是否为一个合法的括号串。

测试样例:

“(()())”,6
返回:true

测试样例:

“()a()()”,7
返回:false

测试样例:

“()(()()”,7
返回:false

解析:

class Parenthesis {
public:
	bool chkParenthesis(string A, int n) {
		// write code here
		int count = 0;
		for (int i = 0; i < n; ++i) {
			if (A[i] == '(') {
				++count;
			}
			else if (A[i] == ')') {
				--count;
				if (count < 0) return false;
			}
			else {
				return false;
			}
		}
		if (count == 0) return true;
		return false;
	}
};

第四题:洪水

题目:

在一个nxm矩阵形状的城市里爆发了洪水,洪水从(0,0)的格子流到这个城市,在这个矩阵中有的格子有一些建筑,洪水只能在没有建筑的格子流动。请返回洪水流到(n - 1,m - 1)的最早时间(洪水只能从一个格子流到其相邻的格子且洪水单位时间能从一个格子流到相邻格子)。

给定一个矩阵map表示城市,其中map[i][j]表示坐标为(i,j)的格子,值为1代表该格子有建筑,0代表没有建筑。同时给定矩阵的大小n和m(n和m均小于等于100),请返回流到(n - 1,m - 1)的最早时间。保证洪水一定能流到终点。

解析:

第五题:硬币表示

题目:

有数量不限的硬币,币值为25分、10分、5分和1分,请编写代码计算n分有几种表示法。

给定一个int n,请返回n分有几种表示法。保证n小于等于100000,为了防止溢出,请将答案Mod 1000000007。

测试样例:

6

返回:

2

解析:

第六题:n皇后问题

题目:

请设计一种算法,解决著名的n皇后问题。这里的n皇后问题指在一个nxn的棋盘上放置n个棋子,使得每行每列和每条对角线上都只有一个棋子,求其摆放的方法数。

给定一个int n,请返回方法数,保证n小于等于15

测试样例:

1

返回:

1

解析:

第七题:堆箱子

题目:

有一堆箱子,每个箱子宽为wi,长为di,高为hi,现在需要将箱子都堆起来,而且为了使堆起来的箱子不倒,上面的箱子的宽度和长度必须小于下面的箱子。请实现一个方法,求出能堆出的最高的高度,这里的高度即堆起来的所有箱子的高度之和。

给定三个int数组w,l,h,分别表示每个箱子宽、长和高,同时给定箱子的数目n。请返回能堆成的最高的高度。保证n小于等于500。

测试样例:

[1,1,1],[1,1,1],[1,1,1]

返回:

1

解析:

你可能感兴趣的:(程序员面试金典84题系列)