0

2つの配列があります。1つはwordsと呼ばれ、もう1つはdataと呼ばれます。文字列をデータから単語にシフトするのに問題があります。これまでのところ私は

    public String[] shiftRightX(String[] words, String[] data)
    {

        for(int i= words.length - 1; i>0; i--)
        {
            words[i]=words[i-1];
            for (int x = 0; x < data.length; x++)
            {
                words [0] = data[x];
            }
        }  
        return words;  
    }

たとえば、次のようになります。

    shiftRightX({"1", "2", "3"}, {"1", "2"}) → {"2", "1", "1"}
    shiftRightX({"1", "2", "3"}, {"1"}) → {"1", "1", "2"}
    shiftRightX({"1", "2"}, {"1", "2"}) → {"2", "1"}

ただし、最後に1回余分にシフトしています。

4

3 に答える 3

1

より高速なバージョン:

public String[] shiftRightX(String[] words, String[] data)
{
  if (data.length < words.length)
     System.arraycopy(words, 0, words, data.length, words.length - data.length);
  for (int i = Math.max(0, data.length - words.length); i < data.length; i++)
     words[data.length - i - 1] = data[i];
  return words;
}
于 2013-01-01T22:55:22.180 に答える
0

ループを交換してみてください:

public String[] shiftRightX(String[] words, String[] data)
{
    for (int x = 0; x < data.length; x++)
    {
        for(int i= words.length - 1; i>0; i--)
        {
            words[i]=words[i-1];
        } 
        words[0] = data[x];
    } 
    return words;  
}

しかし、このアルゴリズムは改善することができます。複雑さはO(n * m)ですが、words配列内の要素data.lengthを1ではなく位置にシフトするとO(n + m)に改善できます。ただし、この場合は、を取得できるため、さらに注意する必要がありますArrayOutOfBoundException

于 2013-01-01T22:45:12.990 に答える
0

私はあなたがやろうとしていることはこのようなものだと思います:

 public String[] shiftRightX(final String[] words, final String[] data){
        String[] result = new String[words.length];
        int i = 0;
        for(String str : data){
            result[i] = str;
            i++;
        }
        for(int j=0;i<words.length;j++){
            result[i] = words[j];
            i++;
        }
        return result;
    }
于 2013-01-01T22:48:47.140 に答える