递归算法

使用递归算法来实现计算1+2+3+4+…+100的结果

  1. static int SUM(int x)
  2. {
  3. if (x <= 1)
  4. return x;
  5. else
  6. return x + SUM(x - 1);
  7. }

一列数的规则如下 : 1 、 1 、 2 、 3 、 5 、 8 、 13 、 21 、 34… 求第 30 位数是多少, 用递归算法实现

  1. static int Foo(int i)
  2. {
  3. if (i <= 0)
  4. return 0;
  5. else if (i > 0 && i <= 2)
  6. return 1;
  7. else
  8. return Foo(i - 1) + Foo(i - 2);
  9. }
  10. static void Main(string[] args)
  11. {
  12. int dataValue = Foo(30);
  13. Console.WriteLine(dataValue.ToString());
  14. }

排序算法

实现一个冒泡排序算法(升序)

  1. static void Sort(int[] nums)
  2. {
  3. int temp;
  4. for (int i = 0; i < nums.Length; i++)
  5. {
  6. for (int j = i + 1; j < nums.Length; j++)
  7. {
  8. if (nums[i] > nums[j])
  9. {
  10. temp = nums[i];
  11. nums[i] = nums[j];
  12. nums[j] = temp;
  13. }
  14. }
  15. Console.WriteLine(nums[i]);
  16. }
  17. }

冒泡排序

  1. namespace BubbleSorter
  2. {
  3. class BubbleSorter
  4. {
  5. private static int[] myArray;
  6. private static int arraySize;
  7. public static void Sort(int[] a)
  8. {
  9. myArray = a;
  10. arraySize = myArray.Length;
  11. BubbleSort(myArray);
  12. }
  13. public static void BubbleSort(int[] myArray)
  14. {
  15. for (int i = 0; i < myArray.Length-1; i++) //由于数组的特点,从0开始,但myArray的长度为5,所以需要减1,实际进行了(0~3)4趟循环
  16. {
  17. for (int j =0; j < myArray.Length -1- i; j++) //内层循环的要点是相邻比较。当j=4的时候,就推出循环了
  18. {
  19. if (myArray[j] > myArray[j + 1])
  20. {
  21. Swap(ref myArray[j], ref myArray[j + 1]);
  22. }
  23. }
  24. }
  25. }
  26. private static void Swap(ref int left, ref int right)
  27. {
  28. int temp;
  29. temp = left;
  30. left = right;
  31. right = temp;
  32. }
  33. static void Main(string[] args)
  34. {
  35. int[] a = { 2, 1, 5, 10, 9 };
  36. BubbleSorter.Sort(a);
  37. foreach (int i in a)
  38. {
  39. Console.WriteLine(i);
  40. }
  41. Console.Read();
  42. }
  43. }
  44. }

选择排序

选择排序是一种简单直观的排序算法。它的工作原理如下。
首先在未排序列中找到最小的元素,存放到排序序列的起始位置。然后,在从剩余未排序元素中继续寻找最小的元素,放到排序序列末尾。以此类推,直到所有元素均排序完毕。

  1. class SelectSorter
  2. {
  3. private static int[] myArray;
  4. private static int arraySize;
  5. public static void Sort(int[] a)
  6. {
  7. myArray = a;
  8. arraySize = myArray.Length;
  9. SelectSort(myArray);
  10. }
  11. public static void SelectSort(int[] myArray)
  12. {
  13. int i, j, smallest;
  14. for(i=0;i<myArray.Length-1;i++) //数据起始位置,从0到倒数第二个数据
  15. {
  16. smallest = i; //记录最小数的下标
  17. for (j = i + 1; j < myArray.Length; j++) //在剩下的数据中寻找最小数
  18. {
  19. if (myArray[j] < myArray[smallest]) {
  20. smallest = j; //如果有比它更小的,记录下标
  21. }
  22. }
  23. Swap(ref myArray[i], ref myArray[smallest]); //将最小数据和未排序的第一个数交换
  24. }
  25. }
  26. private static void Swap(ref int left, ref int right)
  27. {
  28. int temp;
  29. temp = left;
  30. left = right;
  31. right = temp;
  32. }
  33. static void Main(string[] args)
  34. {
  35. int[] a = new int[] { 4, 2, 1, 6, 3 };
  36. SelectSorter.Sort(a);
  37. for (int i = 0; i < a.Length; i++)
  38. {
  39. System.Console.WriteLine(a[i]);
  40. }
  41. System.Console.Read();
  42. }
  43. }

其他

  1. 实现一个方法,对于输入的任意字符串,统计出其中每一种字符出现的次数

    1. /** 字典的定义
    2. 必须包含名空间System.Collection.Generic
    3. Dictionary里面的每一个元素都是一个键值对(由二个元素组成:键和值)
    4. 键必须是唯一的,而值不需要唯一的
    5. 键和值都可以是任何类型(比如:string, int, 自定义类型,等等)
    6. 通过一个键读取一个值的时间是接近O(1)
    7. 键值对之间的偏序可以不定义
    8. */
    9. static void CountChar(string str)
    10. {
    11. Dictionary<char, int> dic = new Dictionary<char, int>();
    12. foreach (char c in str)
    13. {
    14. if (dic.ContainsKey(c))
    15. dic[c]++;
    16. else
    17. dic.Add(c, 1);
    18. }
    19. foreach (KeyValuePair<char, int> p in dic)
    20. {
    21. Console.WriteLine("字符{0},出现的次数{1}", p.Key.ToString(), p.Value.ToString());
    22. }
    23. }
  2. 实现一个将字符串转换为整数的方法,不要使用int.Parse、int.TryParse、Convert.ToInt32等任何类库方法

    1. static bool TryParse(string s, out int num)
    2. {
    3. if (!string.IsNullOrWhiteSpace(s))
    4. {
    5. num = 0;
    6. return false;
    7. }
    8. int result = 0;
    9. bool minus = s[0] == '-' ? true : false;
    10. if (minus && s.Length == 1)
    11. {
    12. num = 0;
    13. return false;
    14. }
    15. for (int i = minus ? 1 : 0; i < s.Length; i++)
    16. {
    17. if (s[i] >= '0' && s[i] <= '9')
    18. {
    19. result = s[i] - 48 + result * 10;
    20. }
    21. else
    22. {
    23. num = 0;
    24. return false;
    25. }
    26. }
    27. num = minus ? -result : result;
    28. return true;
    29. }
  3. 求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m ```csharp //通过顺序规律写程序,同时也知道flag标志位的重要性 static int F1(int m)
    {
    int sum =0;
    bool flag =true;
    for (int i = 1; i <= m; i++)
    {

    1. if (flag) //一次是默认是True,下下也为True
    2. sum += i;
    3. else
    4. sum -= i;
    5. flag = !flag;

    }
    return sum;
    }

//通过奇偶性
static int F2(int m)
{
int sum = 0;
for (int i = 1; i <= m; i++)
{
if (i % 2 >0) //即为奇数
sum += i;
else
sum -= i;
}
return sum;
}

  1. 1. 1234个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
  2. ```csharp
  3. class Program
  4. {
  5. static void Main(string[] args)
  6. {
  7. //有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
  8. //分解题目
  9. //条件:四个数字1、2、3、4 ;三位数:百位、十位、个位
  10. //要求:互不相同;无重复数字:每个数字在三位中只出现一次
  11. //结果:多少个? 都是多少?
  12. int count = 0; //统计个数
  13. for (int bw = 1; bw <= 4; bw++)
  14. {
  15. for (int sw = 1; sw <= 4; sw++)
  16. {
  17. if (sw!= bw) //很显然,只有百位和十位不同的情况下才能谈个位。
  18. {
  19. for (int gw = 1; gw <= 4; gw++)
  20. {
  21. if (gw != sw && gw != bw) //百位用过的,十位就不能用;百位和十位都用过的,个位就不能用
  22. {
  23. count++;
  24. Console.WriteLine("{0}{1}{2}", bw, sw, gw);
  25. }
  26. }
  27. }
  28. }
  29. }
  30. Console.WriteLine("一共有{0}个", count);
  31. Console.Read();
  32. }
  33. }
  1. 一个6位数乘以一个3位数,得到一个结果。但不清楚6位数的两个数字是什么,而且结果中有一位数字也不清楚,请编程找出问好代表的数字,答案可能有多个。

表达式:12?56?*123 = 154?4987

  1. for (int a = 0; a < 10; a++)
  2. {
  3. for (int b = 0; b < 10; b++)
  4. {
  5. for (int c = 0; c < 10; c++)
  6. {
  7. if ((120560 + a + b * 1000) * 123 == 15404987 + c * 10000)
  8. {
  9. Console.WriteLine(a);
  10. Console.WriteLine(b);
  11. Console.WriteLine(c);
  12. }
  13. }
  14. }
  15. }
  16. Console.Read();
  1. 有一个字符串 “I am a good man”,设计一个函数,返回 “man good a am I”。

    1. static string Reverse()
    2. {
    3. string s = "I am a good man";
    4. string[] arr = s.Split(' ');
    5. string res = "";
    6. for (int i = arr.Length - 1; i >= 0; i--)
    7. {
    8. res += arr[i];
    9. if (i > 0)
    10. res += " ";
    11. }
    12. return res;
    13. }
  2. C# 九九乘法表算法实现

    1. static void Mu()
    2. {
    3. string t = string.Empty;
    4. for (int i = 1; i < 10; i++)
    5. {
    6. for (int j = 1; j <= i; j++)
    7. {
    8. t = string.Format("{0}*{1}={2} ", j, i, (j * i));
    9. Console.Write(t);
    10. //if (j * i < 82)
    11. // Console.Write(" ");
    12. if (i == j)
    13. Console.Write("\n");
    14. }
    15. }
    16. }
  3. 在1~10000的整数中,找出同时符合以下条件的数:a.必须是质数。b.该数字各位数字之和为偶数,如数字12345,各位数字之和为1+2+3+4+5=15,不是偶数。

本题考了两个地方:
(1)、质数的理解:质数就是所有比1大的整数中,除了1和它本身外,不再有别的约数。2是一个不是奇数的质数,它既是质数也是偶数,面试者极容易忽略这点。判断数N是否为质数要直接从3开始判断(如果N不是2),首先不能是偶数,然后再判断是否能被3、5、7….整除,直到sqrt(N)止。
(2)、求各位数字之和,可以通过循环取余的办法。

  1. using System;
  2. using System.Collections.Generic;
  3. class program
  4. {
  5. static void Mian(string[] args)
  6. {
  7. int N =1000;
  8. List<int> primes = new List<int>();
  9. primes.Add(2);
  10. Console.Write(2+" ");
  11. for(int i=3;i<N,i+=2)
  12. {
  13. if(!)
  14. }
  15. }
  16. static bool IsDigitSumEven(int n)
  17. {
  18. int sum=0;
  19. while(n>0)
  20. {
  21. sum +=n% 10;
  22. n /=10;
  23. }
  24. return sum%2==0;
  25. }
  26. }