考官出了两道大二时候经常考的算法题。用惯了IDE的他居然一时蒙掉了,提笔多次却无从落笔。悲剧之余,只得铩羽而归...
为了不和这哥们一样,我觉得好好复习复习算法相关的问题,争取每天一个算法题,以题促进。对于我个人的解决方案肯定有部分是比较粗陋的,希望各位大牛不吝赐教,留下各位的算法。当然我觉得各位在看我的算法之前自己动手写写应该也是有提高的,最好是用记事本写,然后直接Copy到IDE中测试,看看离开了Intelligence还能不能直接Run的起来...
1: 经典的冒泡排序
简述:给出一组乱序数组 如: int[] a = new int[10]{1,3,5,12,14,2,4,6,2,7};
要求:写出f(n), 使得乱序数组按序排列。
2 {
3 int[] a = new int[10]{1,3,5,12,14,2,4,6,2,7};
4 int temp = 0;
5 for(int i=0;i<a.Length;i++)
6 {
7 for(int j=i;j<a.Length;j++)
8 {
9 if(a[i]>a[j])
10 {
11 temp = a[i];
12 a[i] = a[j];
13 a[j] = temp;
14 }
15 }
16 }
17 for(int i=0;i<a.Length;i++)
18 {
19 Console.WriteLine(a[i]);
20 }
21 }
解析:面试最常见的排序之一,按顺序将每一个值和后面的所有值作一次比较,符合要求(如 a[0] > a[1])则a[1]替代a[0],否则不变;这样一轮下来总能保证最小的冒到最上面。N(数组的Length-1)轮过后,对每一个数字都进行了调换,于是排序成功。
扩展:待补充...
2: 计算数列任前后两项和
简述:给出一数字序列 {1,1,2,3,5,8...}
要求:写出f(n), 计算第N位数字的值。
2 {
3 int a = 1,b = 1,total = 0;
4 int n;
5 n = int.Parse(Console.ReadLine());
6 n = n -2;
7 if(n<=0)
8 {
9 total = 1;
10 }
11 else
12 {
13 for(int i =0;i<n;i++)
14 {
15 total = a+b;
16 a=b;
17 b=total;
18 }
19 }
20 Console.WriteLine(total);
21 }
解析:同样常见的面试题,有题可知,每个数字均为前两个数字之和,由于规定不能用递归,所以用循环的方法就是只能由小做到大。设定两个变量存储前两位值,每次循环为这两个变量重新赋值,直到循环到需求的次数为止。
扩展:待补充...
3: 插入排序
简述:给出两数字序列 int[] a = new int[]{1,2,3,4,7,8,9,10}; 和 int[] b = new int[]{2,5,6,8};
要求:写出f(n), 把b中的数字按顺序插入到a中,为了简便,默认a,b中数字已经排序。
2 {
3 int[] a = new int[]{1,2,3,4,7,8,9,10};
4 int[] b = new int[]{2,5,6,8};
5 int z= 0;
6 int[] result = new int[a.Length+b.Length];
7 for(int i = 0;i<a.Length;i++)
8 {
9 for(int j=0;j<b.Length;j++)
10 {
11 if(a[i]>b[j])
12 {
13 result[z]=b[j];
14 b[j] = int.MaxValue;
15 z+=1;
16 }
17 }
18 result[z] = a[i];
19 z+=1;
20 }
21 for(int i = 0;i<result.Length;i++)
22 {
23 Console.WriteLine(result[i]);
24 }
25 }
解析:典型的插值,我稍加改变,本来是插入一个数,我改成了插入一个数组。实现原理就是new新的数组result,然后按顺序把a中元素和b中的每个元素比较,符合要求的(a[i]>b[j])家,先插入b[j]到result数组,在插入a[i],否则直接插入a[i]。这里设置b[j]为int.MaxValue是为了不对b中元素重复操作。我想肯定有更好的算法,希望大家不吝赐教。