1. 找出一个数组中,最大的一段连续的数的和。Find out the subarray which has the largest sum.
例如:[1, -3, 2, -4 , 5 , 6, -2, 6, 7] 最大的和就是 22 = 5 + 6 - 2 + 6 +7.
解法如下:
int subMax(int [] a)
{
int best = 0;
int sum = 0;
for(int i = 0; i < a.length; i++)
{
sum = sum + a[i];
if(sum < 0 )
sum = 0;
else if(sum > best)
best = sum;
}
return best;
}
想法就是一直加接下来的数,如果小于零就变为0,大于最大的数就更新。其中一点就是,如果遇到负数,
如果和不小于零就不用使sum为零。如果数组全部为负数,上面的代码有点问题,但不改了。如果想知道
这个最大的和的序列是什么,只要稍微改变就可以了,不说了。
2.
Ugly Number: 找出第n个能被2,3,5整除的数
例如:2, 3, 4, 5, 6, 9,10, 12, 15, 20, 25 ... 第3个是4, 第4个是5,第5个是6 ... 第200是?
想法:首先是从 1开始,2,3,5分别乘1,最小的是2,接下来就是2,2的位置进1,3和5的位置不变
再来一次,最小的是3,3的位置进1,2和5位置进1,再来一次,最小的是4,3和5的位置不变。。。
int uglyNum( int n)
{
int a = new int[n+1]
a[0] = 1;
int i2 = 0, i3 = 0, i5 = 0;
int n2 = 0; n3 = 0; n5 = 0;
int m = 0;
for(int i = 0; i <= n; i++)
{
n2 = a[i2] * 2;
n3 = a[i3] * 3;
n5 = a[i5] * 5;
m = min(n2, n3, n5);
if(m == n2)
{
a[i] = m;
i2++;
}
//similar for i3 and i5
}
return a[n];
}
3. 最后一个问题:给 i, j 两个数,然后打印出 2^i ,5^j 的序列
例如: i = 3 j =4 就打印出:
2^0 * 5 ^0 = 1
2^1 * 5^0 = 2
2^2 * 5 ^0 = 4
2^0 * 5^1 = 5
2^3 * 5^0 = 8
2^1 * 5^1 = 10
...
解法:和上面一个解法很相似,不过注意要处理相等的情况,比如2 * 2^1 * 5 ^1 = 20 2^2 * 5^0 ^5 = 20,
代码就不写了。