华为机试做题-3

来源:互联网 发布:苹果6网络不可用 编辑:程序博客网 时间:2024/06/05 17:31

问题:

有N个灯放一排,从1至N依次顺序编号。有N个人站一排,也从1至N一次编号。1号将灯全开,二号将2的倍数拉一次,关掉。。。。。最后还剩几盏灯亮着


    public static void ladengwetnt(){    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));    try {    String inStr = br.readLine();    int n = Integer.parseInt(inStr);    if(n < 1 || n> 65535){    return;    }    int[] arr = new int[n];     for(int i = 0;i < n;i++){    arr[i] = 0;    }        for(int k = 1;k<=n;k++){    for(int i = 1;i <= n;i++){        if(i*k <=n ){    arr[i*k - 1] = (arr[i*k -1]+1)%2;    }    else{    break;    }    }    }    int count = 0;    for(int i = 0;i < n;i++){    if(arr[i] == 1){    count++;    }    }    System.out.print(count);} catch (Exception e) {// TODO: handle exception//程序中只可能出现非法字符转数字异常 直接退出return;}    }

主要问题是循环,如果不优化内层循环的话,跑65535的时候,10秒钟内是跑不出结果的,需要进一步优化内层循环,之前的循环里代码是:
    for(int k = 1;k<=n;k++){    for(int i = 1;i <= n;i++){    arr[i%k] = (arr[i%k]+1)%2;    }

这样的话内存循环要跑n次才结束,需要优化内层循环,因此需要进一步优化。优化结果在最上面。基本是瞬间出结果。不优化的话 OJ平台的审核结果是运行时超时。



0 0
原创粉丝点击