1.最长平台

  问题:已知一个从小到大的有序数组,这个数组中一个平台就是连续的一串

值相同的数,并且不可再延伸。请找出最长的平台。例如:1,2,2,3,3,3,3,4,5,5,6中

1,2,3,4,5,6各自是一个平台,找出连续最长的。

  先上python,本人思考问题后总是先用python实现,然后再转成c或者c++,

难道python实现起来容易?我感觉有点。

plateau.py :

 1 def num(a):
 2     t=a[0]
 3     c=0
 4     b=0
 5     tmp=0
 6     for i in a:
 7         if t==i:
 8             c+=1
 9         else:           
10             if b<c:
11                 tmp=t
12                 b=c
13             t=i
14             c=1
15     if b<c:
16             tmp=a[len(a)-1]
17             #b=c
18     return tmp
19 if __name__=='__main__':
20     a=[1,1,1,1,1,1,1,1,1,2,2,3,3,3,\
21        3,4,5,5,5,6,6,6,6,6,6,7,7,8,8,8,8,8,8,8,8,8,8]
22     print num(a)

c语言实现,plateau.c:

 1 #include <stdio.h>
 2 int num(int *a,int len)
 3 {
 4     int t=a[0];
 5     int c=0,b=0,tmp=0;
 6     for (int i =0;i<len;i++)
 7     {
 8         if(t==a[i])
 9             c++;
10         else{
11             if(b<c){
12                 tmp=t;
13                 b=c;
14             }
15             t=a[i];
16             c=1;
17 
18         }
19     }
20     if(b<c)
21         tmp=a[len-1];
22     return tmp;
23 }
24 int main()
25 {
26     int arr[]={1,1,1,1,1,1,1,1,1,2,2,3,3,3,3,4,5,5,5,6,6,6,6,6,6,7,7,8,8,8,8,8,8,8,8,8,8};
27     int tmp=num(arr,37);
28     printf("%d\n", tmp);
29     return 0;
30 }

程序跑起来后,感兴趣看看python程序与c的时间比较:

 1 $ time python plateau.py
 2 8
 3 
 4 real    0m0.144s
 5 user    0m0.015s
 6 sys     0m0.109s
 7 
 8 
 9 $ time ./plateau    //gcc -o plateau plateau.c
10 8
11 
12 real    0m0.046s
13 user    0m0.000s
14 sys     0m0.030s

  主要看红色两行与绿色两行分别相加的结果来比较,C程序可不是一般的快。

至于real时间主要是操作系统中存在中断,导致同一个程序运行时间差异可能也很大,

所以用real比较不太准确,上面的时间计算相对精确些。最近看算法,记录记录,要的要的。

  但是上面的程序效率不高,但是优点是能够很容易的知道哪个数连续最长。下面介绍一个

非常高效的计算出最长数连续多长,但是是哪个数最长,不好解决。主要思想是如果一个数n连续的

长度L,那么下一个比n长就自加L,否则L不变,继续下一个数。

simple.c :

 1 #include <stdio.h>
 2 int num(int *a,int length)
 3 {
 4     int len=1;
 5     int i;
 6     for(i=1;i<length;i++)
 7         if(a[i]==a[i-len])
 8             len++;
 9     return len;
10 }
11 int main()
12 {
13     int arr[]={1,1,1,1,1,1,1,1,1,2,2,3,3,3,3,4,5,5,5,6,6,6,6,6,6,7,7,8,8,8,8,8,8,8,8,8,8};
14     int tmp=num(arr,37);
15     printf("%d\n", tmp);
16     return 0;
17 }

 

转载于:https://www.cnblogs.com/wuchaofan/archive/2013/06/08/3127682.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值