1

私は Objective-C 言語に非常に慣れていないので、インタビューで質問されましたが、答えることができませんでした。

私は多くのアプローチとロジックを試しましたが、成功しませんでした。ここで答えを探しています:

質問は次のとおりです。

 - (NSArray *)reorderTheArraysAndMergeThemInDescendingOrder:(NSArray *)firstArray and:(NSArray *)secondArray

引数で指定された両方の配列は、すでに昇順でソートされています。

私の仕事は、firstArray と secondArray の両方のすべての一意の要素を持ち、それらを降順で持つ戻り変数として配列を提供することでした。私は、Objective-C の組み込みの並べ替え機能を使用することを許可されていませんでした (これは、私がこの分野に携わって以来ずっと行ってきた方法です)。私の変数はプリミティブのみである可能性があります(結果はもちろん整数配列になります)。

私はプログラミングシーン全体にまったく慣れていないので、ここで良い答えをいただければ幸いです。

秋鶴

4

2 に答える 2

5

提供された配列は昇順でソートされているため、この質問は の古典的なアルゴリズムにかなり関連してMergesortいます (聞いたことがない場合は、これを見てください。これは古典的です)。

配列にはプリミティブデータ型のみが含まれているため、それらを使用して比較できます<

興味のあるコードは次のようになります

- (NSArray *)reorderAndMergeReverse:(NSArray *)array1 and:(NSArray *)array2{

    NSMutableArray *result = [NSMUtableArray array];

     int i = array1.count-1;
     int j = array2.count-1;

     while (result.count < array1.count+array2.count){

        if ([array1 objectAtIndex:i] > [array2 objectAtIndex:j]){
             [result addObject:[array1 objectAtIndex:i]];
             i--:
        } else {
            [result addObject:[array2 objectAtIndex:j]];
             j--:
        }

     }
     return result;
}

重複を削除するかどうかわかりませんが、あなたの質問はそれほど明確ではありません。コードを改善できるように、そうであれば教えていただけますか?
編集:とにかくやりました:あなたは配列がソートされているので、重複は互いに隣り合っているので、そもそもそれらを追加しないのは簡単かもしれません。

- (NSArray *)reorderAndMergeReverse:(NSArray *)array1 and:(NSArray *)array2{

    NSMutableArray *result = [NSMUtableArray array];

     int i = array1.count-1;
     int j = array2.count-1;
     int k = 0;

     while (i>=0 || j>=0){

        if ([array1 objectAtIndex:i] > [array2 objectAtIndex:j]){
             if ([array1 objectAtIndex:i] != [result objectAtIndex:k]){
                 [result addObject:[array1 objectAtIndex:i]];
                 k++;
             }
             i--:
        } else {
            if (array2 objectAtIndex:j] != [result objectAtIndex:k]){
                   [result addObject:[array2 objectAtIndex:j]];
                   k++;
             }
             j--:
        }

     }
     return result;
}

編集:そのコードにはいくつかのエラーがあります.これは、すぐiに使えるobjectAtIndex:コードソリューションを提供するためではなく、アイデアを実証するためのものです.

于 2012-07-23T06:20:37.057 に答える
1

これにアプローチする方法はたくさんあります。配列を逆にして、2 番目の項目を最初の項目に挿入するか、2 番目の項目を最初の項目に追加して並べ替えることができます。

私が見つけることができる最も簡単な方法を示すコードを後で投稿します。どれだけ速く効率的である必要がありますか? それが仕事を成し遂げる限り、それは何でもできますか?

編集: Olotiarhas が私を打ち負かしたようです。

于 2012-07-23T06:14:35.200 に答える