2016-07-09 5 views
0

以下のコード文字列は、数字が空白で区切られたメソッドで渡されます。 これで、文字列中の最小の2つの数字の合計を提供する必要があります。どうすればこのJavaコードを最適化できますか?

public class SumNearZero { 
public static int SumNearZero(String s) { 
String temp=s; 
int t1=0; 
for (int i = 0; i <s.length(); i++) { 

    if(temp.contains(" ")) 
    { 
     t1++; 
     temp=temp.substring(temp.indexOf(" ")+1); 
    } 
} 
int a[]=new int[++t1]; 
int index=0; 
for(int i=0; i<s.length(); i++) 
{ 
if(s.contains(" ")) 
{ 
    a[index]=Integer.parseInt(s.substring(0,s.indexOf(" "))); 
    s=s.substring(s.indexOf(" ")+1); 
    index++; 
} 

} 
a[index]=Integer.parseInt(s); 

for (int i = 0; i < a.length; i++) { 

for(int j=0; j<a.length-1; j++) 
{ 
    int c=a[j],n=a[j+1]; 
    if(c>n) 
    { 
     int t=c; 
     a[j]=n; 
     a[j+1]=t; 

    } } } 
int result=a.length>1 ? a[0]+a[1]:a[0]; 
return result; 
    } 
public static void main(String[] args) { 
System.out.println(SumNearZero("35 96 10 20 5")); 
     } 
     } 

上記のコードはうまくいきますが、コードを減らしたいと思います。これに関するいくつかの提案があれば、私はあなたから学ぶことができます。

制限事項:コレクションの使用、事前に定義された方法例えば(のstring.Split()、は、Arrays.sort()...)

+0

コードが機能している可能性がありますが、スタイルはひどいです。 1)インデントがひどい。 2)識別子資本化規則の違反。 3)無意味な変数名。 4)javadocsはありません。 IMOでは、コードを単純化/最適化するために時間を費やす前に、これらの問題を修正する必要があります。どうして?他の人にあなたのコードを読むように求めているから...そのコードを回答として投稿した方が良い場合は –

+0

です。 –

+0

私はそれよりもうまくいくでしょう。あなたのコードスタイルをElliott Frischのコードと比較してください。彼がコードをインデントしている様子を見てください。彼が正しい識別子スタイルをどのように使用しているか、一貫した空白、一貫性のある改行などについて教えてください。エリオットのコードスタイルをコピーしてください! –

答えて

2

。次に、その方法では、ListIntegerに作成し、入力を1つ(以上)の空白文字で分割して生成された部分文字列を繰り返します。次に、Listをソートします。最後に、最初の2つの要素の合計を返す 1つの番号(または番号がない)のエラーチェックを行うのも良いことです。それはその後、私は一度ソート

(私は予想通り)を取得

public static void main(String[] args) { 
    System.out.println(sumNearZero("35 96 10 20 5")); 
} 

のようにそれを呼び出す

public static int sumNearZero(String s) { 
    List<Integer> al = new ArrayList<>(); 
    for (String str : s.split("\\s+")) { 
     al.add(Integer.parseInt(str)); 
    } 
    if (al.isEmpty()) { 
     return 0; 
    } 
    Collections.sort(al); 
    if (al.size() == 1) { 
     return al.get(0); 
    } 
    return (al.get(0) + al.get(1)); 
} 

のようになります。最初の二つは最小であり、最後の二つは最大

+0

すてきで素敵な答え! @Elliot – TapanHP

+0

は本当に便利ですが、コードでコレクションの使用が許可されていない場合はどうでしょうか? –

+0

@piyushsinghあなたはあなたの質問に*制限*を記述しておきます。 –

0

ので、実際のコードを与えていない、運動のように見えます。

私はあなたが静的メソッドを作成し、それを起動し、コンストラクタであなたの計算と表示を行わないことをお勧め使用のstring.Splitとは、Arrays.sort

+0

これは練習ではありません。 –

1

ているあなたは、ループごとに時間をfor each loopを使用する代わりに、で、それはより速く行うことができますループは、配列、リストに増加している時はいつでも、それはそれ以上を推奨し、より高速なアプローチであります

さらに、split関数を使用して文字列のすべての数値を取得することができます。これらの数値の配列を取得します。次に、小さなnumbers.thisを取得するロジックを置くことで、あなたは最適化について学びたいと思っていますthisは決定的なガイドです。私はそれを通過することをお勧めします。答えはthisです。

+0

@piyushsinghエリオットの答えは、それが最速の方法になる – TapanHP

関連する問題