2017-02-18 12 views
-2

文字列の数字が昇順であるかどうかを調べたい場合は、昇順でない場合はTRUEを、それ以外の場合はFALSEを出力する必要があります。文字列の数値シーケンスを増やすjava

重要*:文字列の順序NUMBERS」 を持ってSTRINGにスペースはありませんが、次のとおりです。

CASE 1 :1234 (Easy)  1 <2<3<4 TRUE 
CASE 2 :9101112 (Medium) 9<10<11<12 TRUE 
CASE 3 :9991000 (Hard)  999<1000 TRUE 
CASE 4 :10203 (Easy)  1<02<03 FALSE (numbers cannot have 0 separated). 

// converting string into array of numbers 
String[] str = s.split(""); 
int[] numbers = new int[str.length]; 
int i = 0; 

for (String a : str) { 
    numbers[i] = Integer.parseInt(a.trim()); 
    i++; 
} 
for(int j=0;j<str.length;j++) 
    System.out.print(numbers[j]+" "); 

//to verify whether they differ by 1 or not 
int flag=0; 

for(int j=0;j<numbers.length-1;j++){ 
    int result=Integer.parseInt(numbers[j]+""+numbers[j+1]) ; 

    if(numbers[j]>=0 && numbers[j]<=8 && numbers[j+1]==numbers[j]+1){ 
    flag=1; 
    } 
    else if(numbers[j]==9){ 
    int res=Integer.parseInt(numbers[j+1]+""+numbers[j+2]) ; 
      if(res==numbers[j]+1) 
      flag=1; 
    } 
    else if(result>9){ 

} 
} 
} 
` 

は、これは私が今までに書いたコードですが、私はより大きな数字のために実行する方法を理解カント99または999のような1。あなたはどのようにこれを実行するか、この疑問を解決するために、任意の他の最適な方法を教えすることはできますか?

おかげ Aasthaジャイナ

+0

私は、所望の結果を達成するための最良の方法は、入力文字列が* *スペースで区切られていないと思います。 ** 9 9 9 **、** 99 9 **、** 9 99 **、または** 999 ** –

+0

たとえば、** 999 **と同様に、次のように解釈できます。インデント)あなたの人間可読性のコード。私は、個人的に、このようなコードを見て拒否するので、幸運。 – Andreas

+0

@DenIsahac。返信ありがとう。しかし、文字列の始めに3桁の数字(999)または2桁の数字(99)または1桁の数字(9)を考慮する必要があると判断する方法。それは非常に混乱しています。アドバイスをお願いします。 –

答えて

-1

が入力された文字列をt、スペースで区切られているはず数値が整数として入力されている場合は、その違いを判断する方法がないため、以下のコードを参考にしてください。

boolean increasing = true; 
String string = "1 7 3 4"; // CHANGE NUMBERS 
String strNumbers[] = string.split(" "); // separate by spaces. 


for(int i = 0; i < strNumbers.length - 1; i++) { 

    // if current number is greater than the next number. 
    if(Integer.parseInt(strNumbers[i]) > Integer.parseInt(strNumbers[i + 1])) { 
    increasing = false; 
    break; // exit loop 
    } 
} 

if(increasing) System.out.println("TRUE"); 
else System.out.println("FALSE"); 
+0

しかし、文字列はスペースで区切られていません。すべての数字は互いに連結されています。だから、これは難しい質問で、これはうまくいかない。 –

0

解決策を説明しますが、コードを記述する必要があります。

あなたは、入力文字列が増加する数字のシーケンスであることは知っていますが、最初の数字の桁数はわかりません。

これは、1桁で始めることを意味します。それが失敗した場合は、入力の長さの半分を試すまで、2桁、次に3桁などを試してください。半分以上になると次の番号を持つことができないので、半分で止まります。

これは、外側のループの場合、1から1までの最初の番号の長さで試行します。

ループでは、substring(begin, end)を使用して最初の番号を抽出し、Integer.parseInt(s)を使用して数値に解析します。これがシーケンスの最初の番号です。 を使用して数値をテキストにフォーマットし、入力の次のN文字(substring(begin, end)を使用して抽出)が一致するかどうかを確認します。一致しない場合は、内側のループを終了し、外側のループを次の大きな初期番号で試行します。

すべての数字が入力文字列の長さに正確に一致する場合は、良いシーケンスが見つかりました。

0

これは、Andreas .Thanksが提案した擬似コードのコードです。

 for (int a0 = 0; a0 < q; a0++) { 
      String s = in.next(); 

      boolean flag = true; 

      for (int i = 1; i < s.length()/2; i++) { 
       int first = Integer.parseInt(s.substring(0, i)); 
          int k=1; 
       for (int j = i; j < s.length(); j++) { 
       if (Integer.toString(first + (k++)).equals(s.substring(j, j + i))) 
       flag = true; 
       else{ 
        flag=false; 
        break; 
       }  
      } 

      if (flag) 
       System.out.println("YES"); 
      else 
       System.out.println("NO"); 

     } 
0

私は以下の解決策を提案します。このコードは、入力シーケンスのすべての部分文字列を生成し、開始インデックスに基づいて順序付けし、開始インデックスから、表示されるすべての番号が順序付けされている終了インデックスに至るパスが存在するかどうかを確認します。しかし、私はあなたの例では間違いに気付いていますか?10203はとなるので、trueと評価する必要があります。

import java.util.*; 
import java.util.stream.Collectors; 

public class PlayGround { 


    private static class Entry { 

     public Entry(int sidx, int eidx, int val) { 
      this.sidx = sidx; 
      this.eidx = eidx; 
      this.val = val; 
     } 

     public int sidx = 0; 
     public int eidx = 0; 
     public int val = 0; 

     @Override 
     public String toString(){ 
      return String.valueOf(this.val); 
     } 
    } 

    public static void main(String[] args) { 
     assert(check("1234")); 
     assert(check("9101112")); 
     assert(check("9991000")); 
     assert(check("10203")); 
    } 

    private static boolean check(String seq) { 

     TreeMap<Integer,Set<Entry>> em = new TreeMap(); 


     // compute all substrings of seq and put them into tree map 
     for(int i = 0; i < seq.length(); i++) { 
      for(int k = 1 ; k <= seq.length()-i; k++) { 
       String s = seq.substring(i,i+k); 

       if(s.startsWith("0")){ 
        continue; 
       } 

       if(!em.containsKey(i)) 
        em.put(i, new HashSet<>()); 

       Entry e = new Entry(i, i+k, Integer.parseInt(s)); 
       em.get(i).add(e); 
      } 
     } 


     if(em.size() <= 1) 
      return false; 


     Map.Entry<Integer,Set<Entry>> first = em.entrySet().iterator().next(); 

     LinkedList<Entry> wlist = new LinkedList<>(); 

     wlist.addAll(first.getValue().stream().filter(e -> e.eidx < seq 
       .length()).collect(Collectors.toSet())); 


     while(!wlist.isEmpty()) { 
      Entry e = wlist.pop(); 

      if(e.eidx == seq.length()) { 
       return true; 
      } 

      int nidx = e.eidx + 1; 

      if(!em.containsKey(nidx)) 
       continue; 

      wlist.addAll(em.get(nidx).stream().filter(n -> n.val > e.val).collect 
        (Collectors.toSet())); 
     } 

     return false; 
    } 
} 
関連する問題