hackerRank上的一道題,如何更快
阿新 • • 發佈:2018-12-24
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,其他測試用例全部超過規定的時間,記錄一下,想想還有什麼思路。。。