1

空でないものに基づいて値を反転する必要があるサイズ 5の配列があります。

空でない値は連続していますが、任意のインデックスに入る可能性があります。たとえば、3 つの空でない値を持つことができます。

c[0], c[1], c[2] or 
c[1], c[2], c[3] or
c[2], c[3], c[4]

またはそれらのうちの4つが任意の順序で来る..

c[0], c[1], c[2], c[3] or
c[1], c[2], c[3], c[4] or

値が空でない場合にのみ、配列を逆にする必要があります。したがって、ケース 1 では、c[2]、c[1]、c[0] などがあります。

ケースには c[3]、c[2]、c[1] などがあります。

空ではなく、配列が動的であり、要求から生成される要素の数。一部の外部コードはインデックスに依存しているため、要素をシフトしてインデックス 0 から開始することはできません。私がしなければならないことは、この配列を逆にして送り返すことだけです。

ハッシュマップを使用してインデックスをマークし、配列内の空でない要素の数をマークしようとしています。この後の進め方がわからないので、どんなアイデアでも大歓迎です!

     HashMap<Integer, String> myHash = new HashMap<Integer, String>(); 

        for(int i = c.length-1; i<=0 ; i--)
            {
                    if(StringUtils.isNotBlank(c[i]))
                    { 
                        countNonEmpty++;
                        myHash.put(i, c[i]); //We need to mark the index and decrement by the countNonEmpty
                       }                
            }


get the first hash element - 
Iterator iter   = myHash.keySet().iterator(); 
 while(iter.hasNext())  
             {
                 Integer correctIndex = (Integer) iter.next();

//But all I need is the first element in hashMap to decide how to set the reverse array's index.           
       if(myHash.size() - correctIndex < 0 )  //This means it will have to be 0 to index for array
                  {  
                     //What is the right index for c[] 
                       c[correctIndex - myHash.size() + 1 ] = myHash.get(correctIndex);
                      continue;
                  }
                  else if(myHash.size() - correctIndex == 0)
                  {   //What is the right index for c[]
                       c[correctIndex - myHash.size() + 1 ] = myHash.get(correctIndex);
                      continue;    
                  }
4

2 に答える 2

3

補助データ構造は必要ありません。

  1. 配列を最初と最後からスキャンして、最初と最後の空でない要素のインデックスを見つけます。

  2. 最初と最後の要素を入れ替えます。

  3. 最初のインデックスをインクリメントし、最後のインデックスをデクリメントします。

  4. の間、手順 2 と 3 を繰り返しますfirst_index < last_index

于 2013-03-06T17:56:57.957 に答える
1

これは、スワッピングを利用して実行 java.util.Arraysするソリューションの簡単なデモンストレーションです。java.util.Collections

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Reverse
{
    static String[] inputArray = new String[5];

    public static void main(String[] args)
    {
        inputArray[2] = "John";
        inputArray[3] = "Sally";
        inputArray[4] = "Fred";

        int startIndex = 0;
        int endIndex = inputArray.length;

        boolean foundStart = false;
        boolean foundEnd = false;
        System.out.println("before sort");
        for (int index = 0; index < inputArray.length; index++)
        {
            System.out.println(inputArray[index]);

            if (!foundStart && inputArray[index] != null)
            {
                startIndex = index;
                foundStart = true;
            }

            if (foundStart && !foundEnd && inputArray[index] == null)
            {
                endIndex = index;
                foundEnd = true;
            }
        }

        System.out.println("\nafter sort");
        List<String> swapList = Arrays.asList(Arrays.copyOfRange(inputArray, startIndex, endIndex));
        Collections.reverse(swapList);
        System.arraycopy(swapList.toArray(new String[swapList.size()]), 0, inputArray, startIndex, swapList.size());

        for (int index = 0; index < inputArray.length; index++)
        {
            System.out.println(inputArray[index]);
        }
    }
}
于 2013-03-06T18:36:01.930 に答える