年末になって、特にいくつかC#の面白いアルゴリズムの問題に貢献します

16995 ワード

2013年、もうすぐ終わります.キックアスC#プログラマーたちは年末ボーナスをもらったのか?またうごめいて動こうとしたのではないでしょうか.転職を通じて自分のために昇給の夢を実現したいのではないでしょうか.よし、転職する前に準備して、C#の筆記試験を準備しましょう.ここで私はいくつかを集めてみんなに捧げて、みんなはまだ比较的に面白いので、出して、みんなに共同で勉强させます.
注:一部の問題は後で参考答案を差し上げます.
問題を見てください.
1:ループ文、条件文は使用できません.コンソールに1~200の200個の数を印刷します.
ここでは再帰を使っています.
private static void Print(int number)
        {
            Console.WriteLine(number);
            if (number % 200 != 0)
            {
                number = number + 1;
                Print(number);
            }
        }

上の参考答案はifを使って、テーマを見間違えて、私のその汗は...
参考答案を添付します.
 static void Main(string[] args)
        {
            Print(1);
            Console.Read();
        }

        private static void Print(int number)
        {
            try
            {
                Console.WriteLine(number);
                int i = 1/(200 - number);
                number = number + 1;
                Print(number);
            }
            catch (DivideByZeroException e)
            {
            }
        }

皆さんの議論によると、良い答えです.
 private static bool Print(int number)
        {
            Console.WriteLine(number);
            return number >= 200 || Print(number + 1);
        }

問題が再帰的に使用できない場合、どのように実現すればいいのでしょうか.
2:5つのAspxページがあり、それぞれ「Page_1.aspx」、「Page_10.aspx」、「Page_100.aspx」、「Page_11.aspx」、「Page_11.aspx」となっています.
Page_1.aspx
Page_10.aspx
Page_11.aspx
Page_100.aspx
Page_111.aspx
参考答案:
 private static void Order()
        {
            var pageList = new[] { "Page_1.aspx", "Page_10.aspx", "Page_100.aspx", "Page_11.aspx", "Page_111.aspx" };
            pageList = pageList.OrderBy(s => int.Parse(Regex.Match(s, @"\d+").Value)).ToArray();
            Array.ForEach(pageList,Console.WriteLine);
        }

 
3:一つの文字列を与えて、コードを書いてみて、N倍の出力文字列を繰り返す機能を実現する.
この問題で注意しなければならないのはcharがC#で2バイトを占めていることです.
参考答案:
 private static string RepeatString(string str, int repeatCount)
        {
            var source = str.ToCharArray();
            var dest = new char[source.Length * repeatCount];
            for (int i = 0; i < repeatCount; i++)
            {
                Buffer.BlockCopy(source, 0, dest, source.Length * i * 2, source.Length * 2);
            }
            return new String(dest);
        }

4:整形配列を指定するには、配列の値を16進数で表示します.
例えば、shortタイプ配列:[255,255,255,255]で、出力結果は00 FF 00 FF 00 FF、byteタイプであればFFFF
参考答案
 private static void DisplayArrayValues(Array arr)
        {
            int elementLength = Buffer.ByteLength(arr) / arr.Length;
            string formatString = String.Format("{{0:X{0}}} ", 2 * elementLength);
            for (int ctr = 0; ctr < arr.Length; ctr++)
                Console.Write(formatString, arr.GetValue(ctr));
            Console.WriteLine();
        }

5:ユーザーが入力したnumeric stringをintegerに変換する機能を持つ関数を自分で実装してください.
参考答案:
private static int StringToInt(string str)
        {
            int result = 0;
            if (Regex.IsMatch(str, @"^-?[0-9]\d*"))
            {
                bool isNegative = false;
                if (str.IndexOf('-') != -1)
                {
                    str = str.Substring(1);
                    isNegative = true;
                }
                for (int i = 0; i < str.Length; i++)
                {
                    result = result * 10 + (str[i] - '0');
                }
                result = isNegative ? result * -1 : result;
            }
            return result;
        }

6:1つの整数numを与えて、この整数が2のN次方であるかどうかを判断する.
参考答案:
private static bool GetFlag(int num)
        {
            if (num < 1) return false;
            return (num & num - 1) == 0;
        }

7:52枚のトランプのトランプアルゴリズムを作成してみましょう.
ヒント:トランプを洗うたびに、ランダムな因子を与えます.
 private static void Shuffle()
        {
            var random = new Random();
            var result = new List<string>();
            string[] cardType = { "  ", "  ", "  ", "  " };
            string[] cardValue = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };
            foreach (string type in cardType)
            {
                var list = cardValue.Select(value => string.Format("{0}{1}", type, value));
                result.AddRange(list);
            }
            result = (from c in result orderby random.Next(0, 51) descending select c).ToList();
            result.ForEach(str => Console.Write("{0},", str));
        }

 
8:1つの牧場には現在、生まれたばかりの羊が20頭あり、雌羊、雄羊はそれぞれ半分ずつある.もし母羊が5歳の時から毎年1人(母羊、雄羊はそれぞれ半分)を産んだら.羊は10歳まで生きて死んだ.すみません、20年後この牧場には羊が何匹いますか?C#でアルゴリズムを書いてください.
この問題の原題は少し卵が痛いので、私の意味で、問題を修正しました.
 参考答案:
もし一胎に雄羊と雌羊が生まれたら.
static void Main(string[] args)
        {
            int sheepCount;
            for (int i = 1; i <= 20; i++)
            {
                sheepCount = GetSheepCount(i) - GetDeathSheepCount(i);
                Console.WriteLine(sheepCount);
            }
         }
 private static int GetSheepCount(int year)
        {
            if (year <= 4)
                return 20;
            return GetSheepCount(year - 1) + GetSheepCount(year - 5) - GetDeathSheepCount(year);
        }

        private static int GetDeathSheepCount(int year)
        {
            if (year < 10)
                return 0;
            return GetSheepCount(year - 10);
        }