统计天数java版和c版

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38409944/article/details/83662771

题目来自:https://www.luogu.org/problemnew/show/P1567

题目背景
统计天数

题目描述
炎热的夏日,KC非常的不爽。他宁可忍受北极的寒冷,也不愿忍受厦门的夏天。最近,他开始研究天气的变化。他希望用研究的结果预测未来的天气。

经历千辛万苦,他收集了连续N(1<=N<=10^7)天的最高气温数据。

现在,他想知道最高气温一直上升的最长连续天数。

输入输出格式
输入格式:
*1行:一个整数N。1<=N<=10^7

*2行:N个空格隔开的整数,表示连续N天的最高气温。0<=最高气温<=10^9。

输出格式:
*1行:一个整数,表示最高气温一直上升的最长连续天数。

输入输出样例
输入样例#1:
10
1 2 3 2 4 5 6 8 5 9
输出样例#1:
5


这道题不难,不过我卡了很久。开始使用的是java,结果直接给我爆内存了,是真的很气,又是缩代码也没有用,后来转换成c就过了。
这个告诉我,c语言的效率是真的高,而java在性能方面差了不是一点两点。


思路:
一开始我是创建了两个数组,一个数组存值,另一个数组存的是当前天数的温度是否大于前一天,如果是,则1,不是则0.设置一个全局sum存储最长升温天数和中间值a1存储当前的升温天数。
过程:
遍历第二个数组,遇到0就判断当前a1是否大于sum是则覆盖。
注意起始0的天也算升温天数中的一天。

后来爆内存了。就取消了存0 1的数组。
再后来又爆内存了,又取消了存储数据的数组。
结果又爆了,心态也爆炸了。
后来想想也许是语言的问题,果然,换了C分分钟AC,而且自认为是暴力中最简单的答案了。

直接撸代码:java版:

import java.util.*;

public class Main {
    public static void main(String args[]) {
        Scanner scanner = new Scanner(System.in);
        int sum = 0,a1,a2=-1,temp=0, num = scanner.nextInt();
        for(int i=0;i<num;i++){
            a1 = scanner.nextInt();
            if(a1>a2){
                temp++;
            }else{
                if(temp>sum){
                    sum=temp;
                }
                temp=1;
            }
            a2=a1;
        }
        System.out.print(sum);
        return;
    }
}

c语言版:

#include <stdio.h>

int main()
{
        int sum = 0,a1,a2=-1,temp=0, num ;
		scanf("%d",&num);
        for(int i=0;i<num;i++){
            scanf("%d",&a1);
            if(a1>a2){
                temp++;
            }else{
                if(temp>sum){
                    sum=temp;
                }
                temp=1;
            }
            a2=a1;
        }
        printf("%d\n",sum);
        return 0;
}

再回到之前的问题,效率问题出在哪呢?我做了一个测试:
拿一组数据:

100
6094 106 5958 877 3352 8959 292 9253 3860 448 5709 8295 4667 2588 3663 2486 1129 8870 3126 6203 727 4316 6541 9689 8818 2119 7331 7598 1879 7303 1100 8740 4567 2649 2373 7505 5848 4337 9953 4436 8395 8273 1028 4449 3363 6254 7856 6710 8422 3833 5690 6664 6326 2550 119 2075 3475 9024 3239 8889 807 543 8103 1441 9731 3873 5194 9557 3256 6245 3266 2777 4552 2390 8550 4777 9701 5694 9133 6736 2586 298 3695 1992 2958 3831 6905 8134 989 6292 8967 118 8442 1765 931 4760 5945 1703 6262 1671

测试效率:
long endTime=System.currentTimeMillis(); //获取开始时间
doSomeThing()
long startTime=System.currentTimeMillis();//获取结束时间
执行时间:endTime-startTime
c语言版3次测试结果为5,java版3次测试结果为6,8,9.
如题数量如果达到10^7级别,那么效率则被无限放大,直接爆内存。

猜你喜欢

转载自blog.csdn.net/qq_38409944/article/details/83662771