几个大公司(IBM、MicroSoft and so on)面试经典数据结构与算法题C#解答

1.链表反转

我想到了两种比较简单的方法

第一种是需要开一个新的链表,将原链表的元素从后到前的插入到新链表中(也就是原链表第一个元素被插入成新链表的最后一个元素)。

第二种是不需要开新的链表,而是逐步反转原链表中元素的指向,例如:

原链表是 1->2->3->4->null  被  逐步修改为 ①2->1->null、3->4->null ②3->2->1->null、4->null ③4->3->2->1->null

最后再将head指向4。

  1 namespace 链表反转
2 {
3 class Node
4 {
5 public int Num { get; set; }
6 public Node Next { get; set; }
7 }
8 class Program
9 {
10 static void Main(string[] args)
11 {
12 NodeList list = new NodeList();
13 list.Add(1);
14 list.Add(2);
15 list.Add(3);
16 list.Add(4);
17 list.Add(5);
18 list.Reverse1();
19 list.Print();
20
21 NodeList list1 = list.Reverse();
22 list1.Print();
23
24 Console.ReadKey();
25 }
26 }
27
28 class NodeList
29 {
30 public Node Head { get; set; }
31 public void Add(int num)
32 {
33 if (Head == null)
34 {
35 Head = new Node();
36 Head.Next = new Node() { Num = num };
37 }
38 else
39 {
40 Node tn = Head;
41 while (tn.Next != null)
42 {
43 tn = tn.Next;
44 }
45 tn.Next = new Node() { Num = num };
46 }
47 }
48
49 public void Print()
50 {
51 Node tn = Head;
52 while(tn.Next!=null)
53 {
54 tn = tn.Next;
55 Console.WriteLine(tn.Num);
56 }
57 }
58
59 //需要开新链表的反转
60 public NodeList Reverse()
61 {
62 NodeList list = new NodeList();
63 Node tn = Head;
64 Node newTn = null;
65 while (tn.Next != null)
66 {
67 tn = tn.Next;
68 if (newTn == null)
69 {
70 newTn = new Node() { Num = tn.Num };
71 }
72 else
73 {
74 newTn = new Node() { Num = tn.Num,Next=newTn };
75 }
76 }
77 list.Head = new Node();
78 list.Head.Next = newTn;
79 return list;
80 }
81
82 //不需要开新链表的反转
83 public void Reverse1()
84 {
85 Node n1 = Head.Next;
86 Node n2 = Head.Next.Next;
87 //第一个节点也就是反转后的最后一个节点,Next要指向null
88 Node first = Head.Next;
89 first.Next = null;
90 //如果链表为空或者链表只有一个元素那就无需调整
91 if (n2 == null || n1 ==null)
92 {
93 return;
94 }
95 //先用Head指向n2的下一个元素,再将n2的Next指向n1,最后将n1和n2向右移动
96 while (n2.Next != null)
97 {
98 Head.Next = n2.Next;
99 n2.Next = n1;
100 n1 = n2;
101 n2 = Head.Next;
102 }
103 //最后要将头结点指向链表反转前的最后一个元素
104 Head.Next = n2;
105 //因为判断条件只调整到最后一个元素的前一个元素,所以要调整最后一个元素的Next指向
106 n2.Next = n1;
107 }
108 }

2.字符串查找第一个不重复的字母

基本原理:第一遍遍历字符串时,用hash表存储每个字符出现的次数,第二遍遍历字符串时,筛选出第一个hash中对应保存的出现次数为1的字符。

 1 namespace 字符串查找第一个不重复的字母
2 {
3 class Program
4 {
5 static Hashtable hash = new Hashtable();
6 static void Main(string[] args)
7 {
8 string s = "asfgasjfoiwoeqkwzxc";
9 Count(s);
10 Console.WriteLine(Search(s));
11 Console.ReadKey();
12 }
13
14 static void Count(string s)
15 {
16 for (int i = 0; i < s.Length; i++)
17 {
18 if (hash.Contains(s[i]))
19 {
20 hash[s[i]] = (int)hash[s[i]]+1;
21 }
22 else
23 {
24 hash[s[i]] = 1;
25 }
26 }
27 }
28
29 static char Search(string s)
30 {
31 for (int i = 0; i < s.Length; i++)
32 {
33 if ((int)hash[s[i]] == 1)
34 {
35 return s[i];
36 }
37 }
38 return '#';
39 }
40 }
41 }

随笔分类 - 数据结构及算法

 
摘要: 几个大公司(IBM、MicroSoft and so on)面试经典数据结构与算法题C#解答1.链表反转我想到了两种比较简单的方法第一种是需要开一个新的链表,将原链表的元素从后到前的插入到新链表中(也就是原链表第一个元素被插入成新链表的最后一个元素)。第二种是不需要开新的链表,而是逐步反转原链表中元...阅读全文
posted @ 2015-05-03 20:43 Sunnier 阅读(352) | 评论 (0) 编辑
 
摘要: 常用数据结构及算法C#实现1.冒泡排序、选择排序、插入排序(三种简单非递归排序) 1 int[] waitSort = { 1,0, 12, 13, 14, 5, 6, 7, 8, 9, 10 }; 2 3 //冒泡排序 4 ...阅读全文
posted @ 2015-04-17 23:52 Sunnier 阅读(36) | 评论 (0) 编辑

算法题C#的更多相关文章

  1. 一道java算法题分析

    最近在面试中遇到这样的一道算法题:       求100!的结果的各位数之和为多少?       如:5!=5*4*3*2*1=120,那么他们的和为1+2+0=3这道题不算难,不过倒是注意的细节也有 ...

  2. FCC上的初级算法题

    核心提示:FCC的算法题一共16道.跟之前简单到令人发指的基础题目相比,难度是上了一个台阶.主要涉及初步的字符串,数组等运算.仍然属于基础的基础,官方网站给出的建议完成时间为50小时,超出了之前所有非 ...

  3. 解决一道leetcode算法题的曲折过程及引发的思考

    写在前面 本题实际解题过程是 从 40秒 --> 24秒 -->1.5秒 --> 715ms --> 320ms --> 48ms --> 36ms --> ...

  4. js 中的算法题,那些经常看到的

    js中遇到的算法题不是很多,可以说基本遇不到.但面试的时候,尤其是一些大公司,总是会出这样那样的算法题,考察一个程序员的逻辑思维能力.如下: 1.回文. 回文是指把相同的词汇或句子,在下文中调换位置或 ...

  5. JavaScript算法题之–随机数的生成

    JavaScript算法题之–随机数的生成 需求描述:从一组有序的数据中生成一组随机并且不重复的数,类似于简单的抽奖程序的实现. 先来生成一个有序的数组: 1 var arr = [], 2      ...

  6. 简单的算法题, Find Minimum in Rotated Sorted Array 的Python实现。

    简单的算法题, Find Minimum in Rotated Sorted Array 的Python实现. 题目: Suppose a sorted array is rotated at som ...

  7. 经典算法题每日演练——第十七题 Dijkstra算法

    原文:经典算法题每日演练--第十七题 Dijkstra算法 或许在生活中,经常会碰到针对某一个问题,在众多的限制条件下,如何去寻找一个最优解?可能大家想到了很多诸如“线性规划”,“动态规划” 这些经典 ...

  8. 经典算法题每日演练——第十六题 Kruskal算法

    原文:经典算法题每日演练--第十六题 Kruskal算法 这篇我们看看第二种生成树的Kruskal算法,这个算法的魅力在于我们可以打一下算法和数据结构的组合拳,很有意思的. 一:思想 若存在M={0, ...

  9. 经典算法题每日演练——第十四题 Prim算法

    原文:经典算法题每日演练--第十四题 Prim算法 图论在数据结构中是非常有趣而复杂的,作为web码农的我,在实际开发中一直没有找到它的使用场景,不像树那样的频繁使用,不过还是准备 仔细的把图论全部过 ...

  10. 经典算法题每日演练——第十一题 Bitmap算法

    原文:经典算法题每日演练--第十一题 Bitmap算法 在所有具有性能优化的数据结构中,我想大家使用最多的就是hash表,是的,在具有定位查找上具有O(1)的常量时间,多么的简洁优美, 但是在特定的场 ...

随机推荐

  1. lunux命令笔记

    文件查看命令 ls / -lh ls list / 路径 -l 具体 -lh 具体的人性化显示 -ld 显示文件夹 -i 显示i节点 mkdir /tmp/mulu/mulu2 /tmp/ma/mb ...

  2. mybatis至mysql插入一个逗号包含值误差

    mybatis至mysql插入形如"11,22,33"当误差.我使用了错误的原因是美元符号镶嵌sql.正确的做法是使用#  有时间去看看mybatis的$和#差异. 版权声明:本文 ...

  3. 你听说过XML吗?

    我们每天都会见到各种各样的书,今天我们就来谈一谈有关书籍带给我们学习的启发. 正如上图所看到的,不同的书籍有不同的外观,比如教科书.儿童图书等:而且书也不是随便能够出版的,要有自己文档结构,语义规则. ...

  4. jwt (JSON Web Token)官方说明

    http://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#appendix-A 相关文章 http://haomou.net/2014 ...

  5. android 视频通话开启呼叫等待后,来第三方的视频通话,接通后通话时间一直显示为0,过几秒之后视频通话自己主动挂断

    开启通话设置视频通话的"来电等待"; 步骤1:測试机和配合机A处于视频通话过程中; 步骤2:配合机B向測试机呼出视频电话; 步骤3:測试机接听配合机B的视频来电; 现象:视频通话过 ...

  6. 关于 cookie 使用中遇到的问题

    前段时间在一个项目中涉及到cookie的存取,于是打算封装一个 cookie 的CRUD .按理来说,这本身是一个很简单的问题,不注意的话简单的问题也有大坑. /** * Set or get coo ...

  7. hdu3037Saving Beans

    Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission ...

  8. MEF初体验之一:在应用程序宿主MEF

    在MEF出现以前,其实微软已经发布了一个类似的框架,叫MAF(Managed Add-in Framework),它旨在使应用程序孤立和更好的管理扩展,而MEF更关心的是可发现性.扩展性和轻便性,后者 ...

  9. Big ball of Mud

    Big ball of Mud 第一种死法:Big ball of Mud 架构里最常用的反面案例是 big ball of mud.很大程度上可以说打格子,把复杂的系统拆解成小格子是架构师最重要的工 ...

  10. 面向对象的软件project——面向对象分析

    为了解决软件危机.一些IT前辈国产软件project这个词汇,软件project它被引入到整个软件开发过程的维护. 软件project从程序的设计角度能够分为两类.一类是面向结构的软件project. ...