1

Java の割り当てに関するアドバイスを探しています。私が求められているのは、リンクされたリストに格納されている数値に対してさまざまな操作を実行し、各桁を個別のノードに配置することです。ポイントは、非常に大きな数の算術演算を実行できるプログラムを作成することです。

私が助けを求めている特定の問題は、int の通常の compareTo() メソッドと同様に、2 つの数値を比較するメソッドを作成することです。this.num < num の場合は -1、this.num > num の場合は +1、等しい場合は 0 を返します。

私にとってこれを困難にしているのは、割り当てが、リンクされたリストが逆の順序で番号を格納する必要があることを指定しているという事実です。たとえば、番号 145 のリンク リストは次のようになります。

5 => 4 => 1 => null

これにより、数値を簡単に追加できますが、比較しようとすると頭痛の種になります。これが私が思いついたものです。コメントは、それがどのように機能するかを説明しています。

public int compareTo(LLNum list)
{ // Compares two numbers.
  // If the two numbers are of a different length, clearly the shortest is the smallest.
  // If the two numbers are of equal length, call traverseToCompare to do the comparison.
  if (this.len > list.len)
  {
    compareResult = 1;
  }
  else if (this.len < list.len)
  {
    compareResult = -1;
  }
  else if (this.len == list.len)
  {
    traverseToCompare(this.head, list.head);
  }

  return compareResult;
}


public void traverseToCompare(ListNode node1, ListNode node2)
{ // In the case that both numbers are of the same length, recursively traverse the list.
  // compare each digit individually while unwinding the stack.
  // Once two digits are found to be different, break out of the unwinding (Note: I could not find a way of breaking out)
  // Since the dominant digit is at the tail end, this ensures the least number of   comparisons.
  if (node1 == null || node2 == null) 
  { // Base case. Handles the case where both numbers are identical.
    compareResult = 0;
    return;
  }
  traverseToCompare(node1.getNext(), node2.getNext());
  if (node1.getItem() > node2.getItem())
  {
    compareResult = 1;
  }
  if (node1.getItem() < node2.getItem())
  {
    compareResult = -1;
  }

  return; 
}

数字が逆順になっていることが、私を再帰に引き寄せた理由です。リストを再帰的にトラバースし、途中で各桁を比較し、最初の桁が同じではない再帰から何らかの方法で抜け出すと思いました。これは再帰を使用する通常の方法ではないことはわかっていますが、他に方法がわかりませんでした。例外をスローするだけで壊れる方法はありますか? それは少しずさんすぎるかもしれないと思います。または、再帰なしでこれを行う方法に関する提案はありますか?

コピーして貼り付けるコードを教えてください。私はただ正しい方向に向けられることを望んでいます。ありがとう!

4

4 に答える 4

0

traverseToCompare では、いくつかのケースに対処する必要があります。再帰を使わないほうがきれいです。以下は解決策になる可能性があります

boolean areSame = true;
boolean digitDiffer = false;
int compareResult = 0;
int length = node1.length
for(int i=0; i<length; i++)
{
   if(!digitDiffer && ((node1.getItem() == node2.getItem()))
   {
     continue
   }
   else
   {
      digitDiffer = true;
      if(node1.getItem() >= node2.getItem())
      {
         compareResult = 1
      }
      else
      {
        compareResult = -1;
      }
   }
}

return compareResult;
于 2013-02-18T04:58:00.593 に答える
0

これを行う必要がある場合は、最初に両方のリストの長さを確認します(あなたがしたように)。それらが等しい場合、比較を行うためのより良い方法は、各リストの反復子を作成することです。次に、反復子を同時にインクリメントし、リンクされたリスト内のその位置の値を比較できます。このようにすると、一方のリストにもう一方のリストよりも大きな数が含まれていると判断されたら、リストの比較を簡単に停止できます。

于 2013-02-18T04:52:52.007 に答える
0

これを行う最善の方法は、各数値のリストをトラバースして数値を構築し、2 つの数値を比較することです。

リストから数値を構築する方法は次のようになります

int i = 0
int f = 1
Do while GetNext() <> Null
    i = i + GetCurrentItem() * f
    f = f * 10
End Do

たとえば。数が 145 の場合、リストは 5->4->1 になります。

したがって、上記のコードを実行すると

i = 0
f = 1

i = i + 5*1 = 5
f = f * 10 = 10

i = i + 4*10 = 45
f = f * 10 = 100

i = i + 1*100 = 145
f = f * 10 = 1000

したがって、i = 145 で出てきます。

于 2013-02-18T04:54:14.657 に答える
0

プレーンな String を使用する方がずっと簡単だったでしょう。任意の長さのデータを保存できるためです。とにかく、要件は LinkedList です。

データが逆の順序で保存されるようになりました。compareToこれは、最も重要なデータが最後の位置に格納されるため、完全なリストを確認するまでメソッドの応答を決定できないことを意味します。

  5 --> 4  --> 1    == 145
  1 --> 4 --> 5     == 541

したがって、少なくとも全体を読んでください。次に、値を文字列に格納してから、compareToメソッドの結果を決定できます。

traverseToCompareメソッドは、同じ長さのアイテムに対して呼び出されます。したがって、独自のアルゴリズムを記述して、 Stringに格納されている 2 つの数値を比較できます。

文字列の編集 が許可されていない場合

次に、同じことを手動で行うように提案します。リスト全体を反復して最後のノードを比較し、最後のノードが同じ場合は前のノードを比較します...

于 2013-02-18T04:56:16.130 に答える