2017-06-26 16 views
-2

私はUVA(10324)から質問をしていましたが、常に時間制限を取得し続けています。私はかなりコードが正しいと確信していますが、まだコードは無限ループに入ります。私はこの質問を6回試みましたが、それを渡すことはできません。UVA 10324ゼロとワン

誰かが間違っている可能性がどのようにいくつかの光を当てることができます:

import java.util.*; 
import java.lang.*; 
import java.io.*; 

/* Name of the class has to be "Main" only if the class is public. */ 
public class Main { 
    public static void main(String[] args) { 
     Scanner sc = new Scanner(System.in); 
     int ii=1; 
     boolean flag = false; 
     while(sc.hasNextLine()){ 
      String str = sc.nextLine(); 
      if(str.trim().isEmpty()) 
       break; 
      int TC = sc.nextInt(); 
      System.out.println("Case " +ii+++":"); 
      while(TC-->0){ 
       flag = false; 
       int a = sc.nextInt(); 
       int b = sc.nextInt(); 
       int c=0; 
       if(a>b){ 
        c=a; 
        a=b; 
        b=c; 
       } 
       c = str.charAt(a)-'0'; 
       for(int i=a+1;i<=b;i++){ 
        if(str.charAt(i)-'0' != c){ 
         flag = true; 
         break; 
        } 
       } 
       System.out.println(flag?"No":"Yes"); 
      } 
      try{ 
       sc.nextLine(); 
      } 
      catch(Exception ex){ 
       break; 
      } 
     } 
} 
} 
+0

'-'0''は不要です。 –

+0

cはaのインデックス付き整数です。 'Integer.parseInt()'または-'0 'は重要です – BeardAspirant

答えて

1

それは非効率的ですwhileループ内のfor(int i=a+1;i<=b;i++)ループの実行です。これは毎回ほとんどの文字列をスキャンする必要があります。

各入力文字列に複数のテストケースがあるため、クエリの方が効率的な別のデータ構造を作成できます。

whileループの前に、各位置のための文字列の開始以降に変更された回数を格納するアレイ、作成:次に

int total = 0; 
int changes[] = new int[str.length()]; 
for(int i = 1; i < changes.length; i++) { 
    if(str.charAt(i) != str.charAt(i - 1)) { 
     total++; 
    } 
    changes[i] = total; 
} 

にフラグを設定することができるとして得た:

boolean flag = (changes[a] != changes[b]); 
+0

ohhhhです。指定された文字列に対して複数回実行されます。明日それを変えて見るでしょう。ありがとう:) – BeardAspirant

関連する問題