常见面试算法小题目分享~更新ing~

来源:互联网 发布:js 对象 属性 编辑:程序博客网 时间:2024/05/19 00:41

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

namespace InterviewPraticeApp
{
    class Program
    {
        private string result = string.Empty;
        static void Main(string[] args)
        {
            Console.WriteLine("********** 测试开始线 **********");
            //Program pp = new Program();
            //string testString = Console.ReadLine();
            //PrintOddStars(int.Parse(testString));
            int[] testArray = { 1, 2, 2, 5, 6, 12, 88, 88, 99, 111, 112, 888, 999, 999 };
            SearchRepeatNumberAndRemoveContains(testArray);
            //Console.WriteLine("字符串反转后为:{0}", ReverseString(testString));
            //int[] testArray = GenerateRandomArray(10);
            //int[] testArray = { 23, 123, 32, 11, 4, 7, 1, 99, 12, 100 };
            //InsertSort(testArray);
            //PrintSortArray(testArray);
            //JudgeRepeatValues(testArray, testArray.Length);
            //int[] testArray2 = { 23, 123, 32, 11, 4, 7, 1, 99, 12, 100 };
            //PrintStar(int.Parse(testString));
            //CalculateLetterCountInString(testString);
            //JudgeLetterCount(testString);
            //ResortString(testString);
            //BubbleSort(testArray);
            //Console.WriteLine();
            //SelectSort(testArray2);
            //BuildTenThousandsRandomString();
            //DisplayDoubleValue();
            //int result = CalculateNumber(int.Parse(testString));
            //CalculateSum(int.Parse(testString));
            //string message = pp.TransformToBinary(int.Parse(testString));
            //Console.WriteLine(message);
            //Console.WriteLine("第{0}个数为{1}", testString, result);
            //float number = -123.456f;
            //int result = (int)number;
            //Console.WriteLine(result);
            //Console.WriteLine(SumTheseNumbers(int.Parse(testString)));
            //string message = Convert.ToString(10, 16);
            //Console.WriteLine(message);
            //int[] testArray1 = { 1, 2, 5, 7, 8, 9, 11, 55, 77, 99, 1000 };
            //int[] testArray2 = { 2, 4, 5, 10, 100, 102, 103, 104, 105, 1011, 1200 };
            //CombineTwoArrayToNewArray(testArray1, testArray2);
            //int testNumber = 124536589;
            //List<int> resultList = new List<int>();
            //int[] result = TransformIntToArrayByMod(testNumber, resultList);
            //foreach (int item in result)
            //{
            //    Console.Write(item + " ");
            //}
            Console.ReadLine();
            Console.WriteLine("********** 测试结束线 **********");

        }

        #region 基本排序-冒泡排序
        private static void BubbleSort(int[] targetArray)
        {
            int length = targetArray.Length;
            int temp = 0;
            for (int outer = 0; outer < length - 1; outer++)
            {
                for (int inner = outer + 1; inner < length; inner++)
                {
                    if (targetArray[inner] < targetArray[outer])
                    {
                        temp = targetArray[outer];
                        targetArray[outer] = targetArray[inner];
                        targetArray[inner] = temp;
                    }
                }
                PrintSortArray(targetArray, (outer + 1));
            }
            Console.WriteLine("冒泡排序后: /n");
            foreach (int item in targetArray)
            {
                Console.Write(item + " ");
            }
            Console.WriteLine();
            Console.WriteLine("测试成功!");
        }
        #endregion

        #region 基本排序-选择排序
        /// <summary>
        /// 算法主要思想每次找到无序列中的最小值的索引,与无序列的第一个交换
        /// </summary>
        /// <param name="targetArray"></param>
        private static void SelectSort(int[] targetArray)
        {
            int length = targetArray.Length;
            int temp = 0;
            for (int i = 0; i < length - 1; i++)
            {
                int min = i;
                for (int j = i + 1; j < length; j++)
                {
                    if (targetArray[j] < targetArray[min])
                    {
                        min = j;
                    }
                }
                temp = targetArray[i];
                targetArray[i] = targetArray[min];
                targetArray[min] = temp;
                PrintSortArray(targetArray, (i + 1));
            }
            Console.WriteLine("选择排序后: /n");
            foreach (int item in targetArray)
            {
                Console.Write(item + " ");
            }
            Console.WriteLine();
            Console.WriteLine("测试成功!");
        }
        #endregion

        #region 插入排序
        private static void InsertSort(int[] targetArray)
        {
            for (int i = 1; i < targetArray.Length; i++)
            {
                if (targetArray[i] < targetArray[i - 1])
                {
                    int temp = targetArray[i];
                    int j = 0;
                    for (j = i - 1; j >= 0 && temp < targetArray[j]; j--)
                    {
                        targetArray[j + 1] = targetArray[j];
                    }
                    targetArray[j + 1] = temp;
                }
                PrintSortArray(targetArray, i);
            }
            Console.WriteLine("插入排序后: /n");
            foreach (int item in targetArray)
            {
                Console.Write(item + " ");
            }
            Console.WriteLine();
            Console.WriteLine("测试成功!");
        }
        #endregion

        #region 将字符串例如 I am a good man 倒叙成 man good a am I
        private static void ResortString(string targetString)
        {
            StringBuilder sb = new StringBuilder();
            List<string> resultList = new List<string>();
            string[] targetArray = targetString.Split(' ');
            for (int i = targetArray.Length - 1; i >= 0; i--)
            {
                resultList.Add(targetArray[i]);
            }
            foreach (string item in resultList)
            {
                sb.Append(item + " ");
            }
            Console.WriteLine(sb.ToString());
            Console.WriteLine("测试成功!");
        }
        #endregion

        #region 判断字符串中各个字母出现的次数
        private static void CalculateLetterCountInString(string targetString)
        {
            char letter = 'a';
            int index = 0;
            int[] resultArrary = new int[26];
            for (int i = 0; i < targetString.Length; i++)
            {
                if (char.IsLetter(targetString[i]))
                {
                    index = char.ToLower(targetString[i]) - letter;
                    resultArrary[index]++;
                }
            }

            for (int j = 0; j < 26; j++)
            {
                if (resultArrary[j] != 0)
                {
                    Console.WriteLine("字母{0}:{1}次", letter, resultArrary[j]);
                }
                letter++;
            }
            Console.WriteLine("测试成功!");
        }
        #endregion

        #region 判断字符串各个字母出现的次数LINQ法
        private static void JudgeLetterCount(string targetString)
        {
            Dictionary<string, int> tempList = new Dictionary<string, int>();
            for (char letter = 'a'; letter < 'z'; letter++)
            {
                var items = from target in targetString
                            where char.ToLower(target) == letter
                            select target;
                if (items.Count() != 0)
                {
                    tempList.Add(letter.ToString(), items.Count());
                }
            }
            Console.WriteLine("字符串中各个字母出现次数情况如下/n");
            foreach (var item in tempList)
            {
                Console.WriteLine("字母{0}: {1}次", item.Key, item.Value);
            }
            Console.WriteLine("测试成功!");
        }
        #endregion

        #region 显示倒阶梯状*
        private static void PrintStar(int count)
        {
            for (int i = count; i > 0; i--)
            {
                for (int j = 0; j < i; j++)
                {
                    Console.Write("*");
                }
                Console.WriteLine();
            }
            Console.WriteLine("测试成功!");
        }
        #endregion

        #region 显示如下*状图
        /// <summary>
        ///*
        ///***
        ///*****
        ///***
        ///*
        ///一个循环打印出上面那种图(奇数行)
        /// </summary>

        private static void PrintOddStars(int starNumber)
        {
            bool flag = starNumber % 2 == 0 ? false : true;
            if (flag)
            {
                for (int i = 0; i <= starNumber; i = i + 2)
                {
                    for (int j = 0; j < i + 1; j++)
                    {
                        Console.Write("*");
                    }
                    Console.WriteLine();
                }
                for (int i = starNumber - 2; i >= 0; i = i - 2)
                {
                    for (int j = 0; j < i; j++)
                    {
                        Console.Write("*");
                    }
                    Console.WriteLine();
                }
                Console.WriteLine("测试成功!");
            }
            else
            {
                Console.WriteLine("您输入的不是奇数!");
            }

        }
        #endregion

        #region 一个长度为10000的字符串,通过随机从a-z中抽取10000个字符组成
        private static void BuildTenThousandsRandomString()
        {
            Random ran = new Random();
            StringBuilder sb = new StringBuilder();
            char[] alphabetArray = new char[26];
            char firstLetter = 'a';
            for (int i = 0; i < 26; i++)
            {
                alphabetArray[i] = firstLetter;
                firstLetter++;
            }
            for (int i = 0; i < 10000; i++)
            {
                sb.Append(alphabetArray[ran.Next(0, alphabetArray.Length)]);
            }
            Console.WriteLine(sb.ToString());
            Console.WriteLine("测试成功!");
        }
        #endregion

        #region 一个已经排好序的数组去掉重复数字,尽量快(LINQ法);
        private static void SearchRepeatNumberAndRemove(int[] targetArray)
        {
            List<int> resultList = new List<int>();
            List<int> repeatList = new List<int>();
            for (int i = 0; i < targetArray.Length; i++)
            {
                resultList.Add(targetArray[i]);
            }
            for (int i = targetArray[0]; i <= targetArray[targetArray.Length - 1]; i++)
            {
                var result = from target in targetArray
                             where target == i
                             select target;
                if (result.Count() > 1)
                {
                    repeatList.Add(i);
                    resultList.Remove(i);
                }
            }
            Console.WriteLine("去重之前的原始数组为:");
            PrintSortArray(targetArray);
            Console.WriteLine("去重之后的结果数组为:");
            PrintSortArray(resultList);
            Console.WriteLine("其中重复数数组为:");
            PrintSortArray(repeatList);
            Console.WriteLine("测试成功!");
        }
        #endregion

        #region 一个已经排好序的数组去掉重复数字Contains法
        private static void SearchRepeatNumberAndRemoveContains(int[] targetArray)
        {
            List<int> resultList = new List<int>();
            List<int> repeatList = new List<int>();
            foreach (int item in targetArray)
            {
                if (!resultList.Contains(item))
                {
                    resultList.Add(item);
                }
                else
                {
                    repeatList.Add(item);
                }
            }
            Console.WriteLine("去重之前的原始数组为:");
            PrintSortArray(targetArray);
            Console.WriteLine("去重之后的结果数组为:");
            PrintSortArray(resultList);
            Console.WriteLine("其中重复数数组为:");
            PrintSortArray(repeatList);
            Console.WriteLine("测试成功!");
        }
        #endregion

        #region 判断是否有重复值
        /// <summary>
        /// 已知有一长度为100的无序随机整型数组,且数值范围是[1,100],
        /// 写一算法,判断数组中是否有存在重复值,要求,不得嵌套循环,不得使用递归
        /// </summary>
        /// <param name="targetArray"></param>
        private static void JudgeRepeatValues(int[] targetArray, int length)
        {
            List<int> repeatList = new List<int>();
            for (int i = 1; i < length + 1; i++)
            {
                var results = from target in targetArray
                              where target == i
                              select target;
                if (results.Count() > 1)
                {
                    repeatList.Add(i);
                }
                if (i >= length)
                {
                    if (repeatList.Count() != 0)
                    {
                        Console.WriteLine("有重复值:/n");
                        foreach (int item in repeatList)
                        {
                            Console.Write(item + " ");
                        }
                        Console.WriteLine();
                        Console.WriteLine("测试结束!");
                    }
                    else
                    {
                        Console.WriteLine("该数组无重复值");
                        Console.WriteLine("测试结束!");
                    }
                }
            }

        }
        #endregion

        #region 1, 1, 2, 3, 5, 8, 13, 21, 34, 55...计算第n个数
        public static int CalculateNumber(int n)
        {
            if (n <= 0)
            {
                return 0;
            }
            else if (n > 0 && n <= 2)
            {
                return 1;
            }
            else
            {
                return CalculateNumber(n - 1) + CalculateNumber(n - 2);
            }
        }

        #endregion

        #region 求表达式的值:1+3+5+7+…..+n
        private static void CalculateSum(int n)
        {
            int sum = 0;
            if (n % 2 == 0)
            {
                MessageBox.Show("你输入的不是奇数!");
            }
            else
            {
                for (int i = 1; i <= n; i = i + 2)
                {
                    sum += i;
                }
            }
            Console.WriteLine("数组串总和为:{0}", sum);
        }
        #endregion

        #region 计算n的阶层
        private static int CalculateNResult(int n)
        {
            if (n == 1)
            {
                return 1;
            }
            else
            {
                return n * CalculateNResult(n);
            }
        }
        #endregion

        #region 写一个输入整数(如123456789)转换为二进制的程序,如输入32则输出1000000
        private string TransformToBinary(int targetNumber)
        {
            string sb = string.Empty;
            if (targetNumber == 0)
            {
                sb = "0";
            }
            if (targetNumber > 0)
            {
                TransformToBinary(targetNumber / 2);
                sb = (targetNumber % 2).ToString();
            }
            result += sb;
            return result;
        }
        #endregion

        #region 写一个函数,当参数N很大的时候,计算下列算式的结果:1-2+3-4+5-6+7-8+…n
        private static long SumTheseNumbers(int n)
        {
            long sum = 0;
            for (int i = 1; i <= n; i++)
            {
                int number = i;
                if (number % 2 == 0)
                {
                    number = -number;
                }
                sum += number;
            }
            return sum;
        }
        #endregion

        #region 写一个实现对一段字符串翻转的方法,附加一些条件,如其中包括“,”、“.”,对其设计测试用 例
        private static string ReverseString(string targetString)
        {
            char[] resultString = targetString.ToCharArray();
            StringBuilder sb = new StringBuilder();
            for (int i = resultString.Length - 1; i >= 0; i--)
            {
                sb.Append(resultString[i]);
            }
            Console.WriteLine("测试成功!");
            return sb.ToString();
        }
        #endregion

        #region 转化int型数内的每个数组为整形数组
        private static int[] TransformIntToArray(int targetNumber)
        {
            List<int> resultList = new List<int>();
            string targetNumberString = targetNumber.ToString();
            for (int i = 0; i < targetNumberString.Length; i++)
            {
                int number = int.Parse(targetNumberString[i].ToString());
                resultList.Add(number);
            }
            return resultList.ToArray();
        }
        #endregion

        #region 转化int型数内的每个数组为整形数组(取余法)
        private static int[] TransformIntToArrayByMod(int targetNumber, List<int> resultList)
        {
            int number = targetNumber / 10;
            int mod = targetNumber % 10;
            resultList.Add(mod);
            if (number > 0)
            {
                TransformIntToArrayByMod(number, resultList);
            }
            resultList.Reverse(0, resultList.Count);
            Console.WriteLine("测试成功!");
            return resultList.ToArray();
        }
        #endregion

        #region 将2个递增数组组合为一个新的递增数组
        private static void CombineTwoArrayToNewArray(int[] targetArray1, int[] targetArray2)
        {
            List<int> resultList = new List<int>();
            int firstIndex = 0;
            int secondIndex = 0;
            while (firstIndex < targetArray1.Length && secondIndex < targetArray2.Length)
            {
                if (targetArray1[firstIndex] < targetArray2[secondIndex])
                {
                    resultList.Add(targetArray1[firstIndex]);
                    firstIndex++;
                }
                else if (targetArray1[firstIndex] == targetArray2[secondIndex])
                {
                    resultList.Add(targetArray1[firstIndex]);
                    resultList.Add(targetArray2[secondIndex]);
                    firstIndex++;
                    secondIndex++;
                }
                else
                {
                    resultList.Add(targetArray2[secondIndex]);
                    secondIndex++;
                }
            }
            if (firstIndex >= targetArray1.Length && secondIndex < targetArray2.Length)
            {
                for (int i = secondIndex; i < targetArray2.Length; i++)
                {
                    resultList.Add(targetArray2[i]);
                }
            }
            else if (secondIndex >= targetArray2.Length && firstIndex < targetArray1.Length)
            {
                for (int i = firstIndex; i < targetArray1.Length; i++)
                {
                    resultList.Add(targetArray1[i]);
                }
            }
            Console.WriteLine("组合后的数组为:");
            foreach (int item in resultList)
            {
                Console.Write(item + " ");
            }
            Console.WriteLine();
            Console.WriteLine("测试成功!");
        }
        #endregion

        #region 清除页面上所有textbox的值
        /// <summary>
        /// 判断是否为Textbox然后进行String.Empty操作
        /// </summary>
        ///// <param name="control"></param>
        //private void ClearData(Control control)
        //{
        //    if (control is TextBox)
        //    {
        //        TextBox box = control as TextBox;
        //        box.Text = string.Empty;
        //    }
        //}
        /// <summary>
        /// 递归寻找所有控件
        /// </summary>
        /// <param name="controls"></param>
        //private void FindControlsAndClearData(ControlCollection controls)
        //{
        //    foreach (Control cc in controls)
        //    {
        //        if (cc.HasControls())
        //        {
        //            FindControlsAndClearData(cc.Controls);
        //        }
        //        else
        //        {
        //            ClearData(cc);
        //        }
        //    }
        //}
        #endregion

        #region Javascript 判断输入内容是否为数字
        //$(document).ready(function() {
        //    var regx = /^/d+$/;
        //    $("#txtNumber").blur(function() {
        //        var txtboxValue = $("#txtNumber").get(0).value;
        //        if (txtboxValue != "") {
        //            if (!regx.test(txtboxValue)) {
        //                alert("您输入的不是数字!")
        //            }
        //        }
        //    });
        //});
        #endregion

        #region DoublePlus
        /// <summary>
        /// 结果为0
        /// </summary>
        private static void DisplayDoubleValue()
        {
            double expectedValue = 1 / 2;
            if (expectedValue > 0)
            {
                expectedValue = expectedValue + 0.5;
            }
            Console.WriteLine(expectedValue);
        }
        #endregion

        /// <summary>
        /// 显示每次排序后的当前数组情况
        /// </summary>
        /// <param name="targetArray"></param>
        /// <param name="count"></param>
        private static void PrintSortArray(int[] targetArray, int count)
        {
            Console.Write("第{0}次排序后:", count);
            foreach (int item in targetArray)
            {
                Console.Write(item + " ");
            }
            Console.WriteLine();
        }

        /// <summary>
        /// 显示当前数组
        /// </summary>
        /// <param name="targetArray"></param>
        private static void PrintSortArray(int[] targetArray)
        {
            foreach (int item in targetArray)
            {
                Console.Write(item + " ");
            }
            Console.WriteLine();
        }

        /// <summary>
        /// 显示当前List集合
        /// </summary>
        /// <param name="targetArray"></param>
        private static void PrintSortArray(List<int> targetArray)
        {
            foreach (int item in targetArray)
            {
                Console.Write(item + " ");
            }
            Console.WriteLine();
        }
        /// <summary>
        /// 生成无序数列
        /// </summary>
        /// <param name="length"></param>
        /// <returns></returns>
        private static int[] GenerateRandomArray(int length)
        {
            Random ran = new Random();
            int[] resultArray = new int[length];
            List<int> tempList = new List<int>();
            int index = 0;
            for (int i = 0; i < length; i++)
            {
                resultArray[i] = i + 1;
            }
            for (int i = 0; i < resultArray.Length; i++)
            {
                index = ran.Next(length);
                tempList.Add(resultArray[index]);
            }
            return tempList.ToArray();
        }
        /// <summary>
        /// 反转数组元素
        /// </summary>
        /// <param name="targetArray"></param>
        /// <returns></returns>
        private static int[] ReverseTheArray(int[] targetArray)
        {
            List<int> resultList = new List<int>();
            for (int i = targetArray.Length - 1; i >= 0; i--)
            {
                resultList.Add(targetArray[i]);
            }
            return resultList.ToArray();
        }

    }

}