华为机试做题-3

问题:

有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平台的审核结果是运行时超时。



 
 

猜你喜欢

转载自blog.csdn.net/Diaoliangwang/article/details/37566007