1. 程式人生 > >hackerRank上的一道題,如何更快

hackerRank上的一道題,如何更快

Project Euler #179: Consecutive positive divisors
題目如下

下面是程式碼


import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Solution {

    public static void main(String[] args) {
        /* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution. */
//輸入n和各個數字 Scanner in = new Scanner(System.in); int n = in.nextInt(); int arr[] = new int[n]; for(int arr_i=0; arr_i < n; arr_i++){ arr[arr_i] = in.nextInt(); } /*思路1, 迴圈計算各個數字的結果(迴圈) 每個數字k,用i從1迴圈到k,計算是否能被整除及整除次數(計算整除次數需要將i從0到i進行迴圈判斷),當i和i+1整除次數相同,結果+1 */
/*思路2, 找出最大的數,建立一個數組或arraylist,將每個數作為索引,迴圈次數作為值放入 只要計算各個數字包含了索引中的哪些i和i+1相等的即可。 */ //最大的數 int maxN=0,locationN=0; //找出最大的數和這個數的位置 for(int i=0 ;i<n ;i++){ if(arr[i]>maxN){ maxN=arr[i]; locationN=i; } } if
(maxN>0){ //建立被整除次數的陣列 int positiveDivisorsResultArray[]=new int[maxN+1]; //結果陣列 int resultArray[]=new int[n]; //利用最大的數計算,填充陣列,將每個數對應的被整除次數放入陣列中 for(int i=1 ;i<=arr[locationN] ;i++){ int resultTmp=0; for(int j=1;j<i ;j++){ if(i%j==0){ //如果可以整除 resultTmp++; } } positiveDivisorsResultArray[i]=resultTmp; } //計算所有數中n和n+1的被整除次數相同的個數 for(int i=0;i<n;i++){ int resultTmp=0; for(int j=1;j<arr[i];j++){ if(positiveDivisorsResultArray[j]==positiveDivisorsResultArray[j+1]){ resultTmp++; } } resultArray[i]=resultTmp; } for(int i=0 ;i< n;i++){ System.out.println(resultArray[i]); } } } }

用的第二種方式,但是除了用例1,其他測試用例全部超過規定的時間,記錄一下,想想還有什麼思路。。。