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,
代碼就不寫了。