zoukankan      html  css  js  c++  java
  • 一些算法的复习和整理,争取每天一个算法

    一哥们去一著名跨国大大大的公司去面试。在很多项目经验,设计,架构,前台,后端都考察个遍后...私以为快要拿到Offer的时候... 不信的事情发生了。
    考官出了两道大二时候经常考的算法题。用惯了IDE的他居然一时蒙掉了,提笔多次却无从落笔。悲剧之余,只得铩羽而归...

      为了不和这哥们一样,我觉得好好复习复习算法相关的问题,争取每天一个算法题,以题促进。对于我个人的解决方案肯定有部分是比较粗陋的,希望各位大牛不吝赐教,留下各位的算法。当然我觉得各位在看我的算法之前自己动手写写应该也是有提高的,最好是用记事本写,然后直接Copy到IDE中测试,看看离开了Intelligence还能不能直接Run的起来...

      1: 经典的冒泡排序
      简述:给出一组乱序数组 如: int[] a = new int[10]{1,3,5,12,14,2,4,6,2,7};
      要求:写出f(n), 使得乱序数组按序排列。  

    View Code
    1 public static void RunSnippet()
    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位数字的值。

    View Code
    1 public static void RunSnippet()
    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中数字已经排序。

    View Code
    1 public static void RunSnippet()
    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中元素重复操作。我想肯定有更好的算法,希望大家不吝赐教。

  • 相关阅读:
    POCO库——Foundation组件之日期时间DateTime
    POCO库——Foundation组件之加解密Crypt
    POCO库——Foundation组件之缓存Cache
    POCO库——Foundation组件之核心Core
    POCO库——Foundation组件概述
    HP-SOCKET TCP/UDP通信框架库解析
    Notepad++ 使用nppexec插件配置简易开发环境
    Duilib源码分析(五)UI布局—Layout与各子控件
    Breakpad Google的crash捕获、抓取开源库
    Pugixml一种快速解析XML文件的开源解析库
  • 原文地址:https://www.cnblogs.com/moss_tan_jun/p/2018513.html
Copyright © 2011-2022 走看看