2

私は C# を学習しており、次の問題を解決しようとしています: 繰り返しメンバーの最長部分配列を返します。たとえば、配列が {1,2,2,3,4,4,4} の場合、{4,4,4} を返す必要があります。 . 私はこれをやろうとしましたが、最長ではなく最初の部分配列を返します。これまでにC#について知っていること:

  • ループ
  • 条件文
  • 配列

何か案は ?

編集:これまでの私のコード編集:はい、多次元配列について何か知っています

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Sequence
{
class Sequence
{
    static void Main(string[] args)
    { 
        Console.Write("Enter size:");
        int size1 = int.Parse(Console.ReadLine());
        int[] array1 = new int[size1];
        for (int i = 0; i <= size1-1; i++)
        {
            Console.Write ("Ënter Number:");
            array1[i]=Int32.Parse(Console.ReadLine());
        }
        int bestLenght = 0;
        int bestStart = 0;
        int lenght = 0;
        int start=0;
        for (int i = 0; i < size1 - 2; i++)
        {
            if (i == 0 && array1[i] == array1[i + 1])
            {
                start = 0;
                lenght = 2;
                if (bestLenght < lenght)
                {
                    bestLenght = lenght;
                    bestStart = 0;
                }
            }
            else if (i != 0 && lenght != 0 && array1[i] == array1[i - 1] && array1[i + 1]   ==              array1[i])
            {
                lenght++;
                if (bestLenght < lenght)
                {
                    bestLenght = lenght;
                    bestStart = start;
                }
            }
            else if (i != 0 && array1[i - 1] != array1[i] && array1[i] == array1[i + 1])
            {
                start = i;
                lenght = 2;
                if (bestLenght < lenght)
                {
                    bestLenght = lenght;
                    bestStart = start;
                }

            }
            else 
            {
                lenght = 0;
            }


        }
        Console.WriteLine(bestLenght);



    }
}

}

Cureently 私はちょうど最長の配列の長さを返そうとしています

4

4 に答える 4

2

言葉による非常に反復的なアプローチ:

  • 配列内の各項目をループします。
  • 現在のアイテムが前のアイテムと同じ場合は、currentSeriesLength1 ずつインクリメントします。
  • そうでない場合は、 と照合しlongestSeriesLengthます。大きい場合は、current indexinlongestSeriesEndcurrent index - currentSeriesLengthinを格納しlongestSeriesStartます。
  • currentSeriesLengthに値を保存しますlongestSeriesLength
  • currentSeriesLength背中を1に セット。
  • 最長のシリーズは と の間のシリーズにlongestSeriesStartなりlongestSeriesEndます。

それをコードに変換することは、あなたにとって良い練習になるでしょう。

于 2012-08-16T09:32:38.930 に答える
1

編集:コードの問題は、最長のリストが最後のサブリストであるエッジケースを処理しないことです

変化する

Console.WriteLine(bestLenght); 

読む

if (lenght > bestLenght) {
  bestLenght=lenght;
  bestStart=start;
}
Console.WriteLine(bestLenght); 

あるいは

linq Aggregate でこれを行うことができます

var x= new[] {1,2,2,3,4,4,4};
var y=x.Aggregate(Tuple.Create(new List<int>(),new List<int>()),
(a,b) =>{
   if (a.Item2.Count()>0 && a.Item2[0] != b) {
     if (a.Item2.Count>a.Item1.Count()) {
       a=Tuple.Create(a.Item2,new List<int>());
     }
     a.Item2.Clear();
   }
   a.Item2.Add(b);
   return a;
},a=>(a.Item2.Count() > a.Item1.Count()) ? a.Item2 : a.Item1);

これが本質的に行うことは、Tuple を使用してコレクションを反復処理して 2 つのリストを格納し、Item1以前の最も長いシーケンスをItem2表し、現在のシーケンスを表すことです。

各アイテムについて、現在のシーケンスが空ではなく、最初のアイテムが異なる場合、新しいサブリストにいるため、最後のシーケンスの長さを確認します。以前の最大値よりも長い場合は、以前の最大値を置き換えます。それ以外の場合は、リストをクリアします。

集計の最後の部分は、2 つのリストのどちらが長いかをチェックします (最長のサブコレクションが最後のものであるかのように、Item1 の長さのチェックは行われません。

このコードは、次のように任意の型を処理する汎用関数に変換できます。

IEnumerable<T> LongestSublist<T>(IEnumerable<T> source) {
return source.Aggregate(Tuple.Create(new List<T>(),new List<T>()),
    (a,b) =>{
       if (a.Item2.Count()>0 && a.Item2[0] != b) {
         if (a.Item2.Count>a.Item1.Count()) {
           a=Tuple.Create(a.Item2,new List<T>());
         }
         a.Item2.Clear();
       }
       a.Item2.Add(b);
       return a;
    },a=>(a.Item2.Count() > a.Item1.Count()) ? a.Item2 : a.Item1);

または拡張機能として

public static IEnumerable<T> LongestSublist<T>(this IEnumerable<T> source) {
return source.Aggregate(Tuple.Create(new List<T>(),new List<T>()),
    (a,b) =>{
       if (a.Item2.Count()>0 && a.Item2[0] != b) {
         if (a.Item2.Count>a.Item1.Count()) {
           a=Tuple.Create(a.Item2,new List<T>());
         }
         a.Item2.Clear();
       }
       a.Item2.Add(b);
       return a;
    },a=>(a.Item2.Count() > a.Item1.Count()) ? a.Item2 : a.Item1);

あなたができるようにする

var longest= new[] {1,2,2,3,4,4,4}.LongestSubList();

于 2012-08-16T09:42:20.473 に答える
1

基本的に、前の番号が現在の番号と同じかどうかを確認し、それに応じてカウンターをインクリメントする必要があります。

正確に「配列をループし、値を新しい配列にコピーします」そして、カウンター値が大きい場合にのみコピーをループします

お役に立てれば

于 2012-08-16T09:24:06.327 に答える
0

実行できるオプションがいくつかあります。

  1. 最も簡単なのは

    • リスト内のすべての整数のすべての出現を検索します
    • 出現回数が最大のものを選択します。
  2. Linq次のようにを使用します。

    var list = new List<int>{1,2,2,3,4,4,4} ;   
    var result = list.GroupBy(r => r).OrderByDescending(grp => grp.Count()).First();
    

    a) 数字によるグループ化 (1 つのグループに al を取得し、別の1グループに2s を取得します... など)

    b)グループをそれぞれの要素の量で降順で並べ替え4ます。この場合、グループに4は3つの要素があるため(他の要素よりも多い)、最初のグループになります。

    c) 最初の要素 (リスト) を取得する

于 2012-08-16T09:30:40.207 に答える