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, 代码就不写了。

posts - 16, comments - 16, trackbacks - 0, articles - 0

Copyright © MichaelCao