2016-09-16 79 views
-3

我解決上HackerRank 這個問題,你可以看到這裏的問題 https://www.hackerrank.com/contests/programming-jam-2-0/challenges/math-practice的Java編程實踐概率

你已經制定了一個策略,幫助你的孩子練習他的數學。首先,你選擇一個正整數N.然後你告訴你的孩子開始命名N,3×N,5×N,7×N等等。

每當他給一個數字命名時,他會考慮該數字中的所有數字。他跟蹤至少一次他所看到的數字(0,1,2,3,4,5,6,7,8和9),至少是他所指定的任何數字的一部分。有一次,他看到每個至少一次的十個數字,他可以去演

,也是我的代碼,但是當我提交給我(在標準輸出上沒有反應) 我修改了代碼,很多次,我不知道哪裏是錯誤 請誰能幫助

package contest; 

import java.util.ArrayList; 

import java.util.Scanner; 

/** 
* 
* @author Mohamed 
*/ 
public class Solution 
{ 
    public static void main(String [] s){ 
     Scanner In = new Scanner(System.in); 
    int number = In.nextInt(); 
    int counter = 1; 
    int length; 
    int oneDigit; 
    int newNumber; 
    int index; 
    boolean condition = true; 
    int [] arr = new int[10]; 

    ArrayList<String> theList = new ArrayList<>(); 

    while(condition = true){ 
     length = (int)(Math.log10(number) + 1); 
     newNumber = number; 
     while(length > 0) 
     { 
      oneDigit = newNumber % 10; 
      newNumber = newNumber/10; 

      if(arr[0] != oneDigit && arr[1] != oneDigit && arr[2] != oneDigit  && 
       arr[3] != oneDigit && arr[4] != oneDigit && arr[5] != oneDigit && 
       arr[6] != oneDigit && arr[7] != oneDigit && arr[8] != oneDigit && 
       arr[9] != oneDigit) 
      { 
       String num = String.valueOf(oneDigit); 
       theList.add(num); 
       index = theList.lastIndexOf(num); 
       arr[index] = oneDigit; 
      } 
      if(newNumber == 0){ 
       length = 0; 
      } 
      else{ 
       length = (int)(Math.log10(newNumber) + 1); 
      } 
     } 
     counter = counter + 2; 
     if(arr[9] != 0) 
     { 
      System.out.println(number); 
      condition = false; 
     } 
     number = number * counter; 
     } 
     } 
    } 
+2

'而(條件=真)'將永遠循環下去,因爲你要指定'真'的變量,那就是也是表達的結果。你可能意味着'while(condition == true)',但是你不應該寫這個,而是寫'while(condition)'。 – Andreas

+2

IMO,最好的回答HackerRank的方法是不要在HackerRank裏寫完代碼 –

+1

@ cricket_007同意。始終使用IDE在本地編寫和測試代碼。在這種情況下,IDE會告訴你'while(condition = true)'問題。 – Andreas

回答

0

使用集合來剔除出現的數字。集合不允許重複

你的代碼應該是這樣的:

Scanner In = new Scanner(System.in); 
int number = In.nextInt(); 
int index = 1; 
int newNum; 
String message = ""; 
Set<Integer> numbersSeen = new HashSet<Integer>(); 

while(true) 
{ 
    newNum = number*index; 
    message += "N ="+number*index+". Now he has seen the digits "; 
    while(newNum > 0) { 
     numbersSeen.add(newNum % 10); 
     newNum /= 10; 
    } 
    for(Integer seenNum : numbersSeen) { 
     message += seenNum +", "; 
    } 
    System.out.println(message.substring(0,message.length()-2)); 
    message = ""; 
    index +=2; 
    if(numbersSeen.size() == 10) { 
     break; 
    } 
} 
-1

調試在本地!它只是根據一些條件有單一的println。如果不滿足這個條件,你將沒有任何打印。

此外,我會建議一些重構,使代碼更容易理解。

  • 將條件變量重命名爲有意義的東西。像isArray9Zero。爲什麼算法只在arr[9] != 0時停止?

  • 使長命名功能我f(arr[0] != oneDigit。那裏正在檢查什麼?