几个大公司(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. 深入理解Javascript闭包概念

    一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部能够直接读取全局变量 ...

  2. GLEW_ERROR_NO_GL_VERSION的解决方法

    关于 GLenum err = glewInit(); if (GLEW_OK != err) fprintf(stderr, "error initializaing GLew %s\n& ...

  3. 使用Bootstrap 他写道网站

    新发现vdceye有些难看的网站,为了找到一个bootstrap工具,我一次又一次地写信给网站 这个工具是很容易使用 http://vdceye.com/ 版权声明:本文博客原创文章,博客,未经同意, ...

  4. 【Java收集的源代码分析】Hashtable源代码分析

    Hashtable简单介绍 Hashtable相同是基于哈希表实现的,相同每一个元素是一个key-value对,其内部也是通过单链表解决冲突问题,容量不足(超过了阀值)时.相同会自己主动增长. Has ...

  5. NYOJ 372 巧克力的

    巧克力 时间限制:4000 ms  |  内存限制:65535 KB 难度:2 描写叙述 布欧能够把人变成巧克力吃了来添加他的能量,也有可能降低. 如今布欧变了n*m个巧克力,并把巧克力排成一个n*m ...

  6. .NET MVC学习笔记(一)

    看了些关于MVC的资料,做一些MVC的笔记. 分解关注点 在MVC世界里有个很重要的观念--"分解关注点"(Separation of Concerns),指的是:当你进行软件开发 ...

  7. ADN中国队参加微软Kinect他赢得了全国比赛三等奖,我们的创意项目与团队Kinect于Naviswork虚拟之旅

    以下是我的英语写了一个简短的总结,直接贴出来. 让我们知道我们在这参加Hackathon That's an exciting Hackathon for me and also China team ...

  8. MySQL列:innodb的源代码的分析的基础数据结构

    在过去的一年中的数据库相关的源代码分析.前段时间分析levelDB实施和BeansDB实现,数据库网络分析这两篇文章非常多.他们也比较深比较分析,所以没有必要重复很多劳力.MYSQL,当然主要还是数据 ...

  9. EJB(一)认识ejb

    什么是ejb? 相同仍旧在这个系列博客之处,谈谈对ejb的认识和理解.         sun微公司对于ejb的定义大体是这种,ejb是一套用于开发和部署分布式组件的的架构.採用ejb的架构应用能够是 ...

  10. Python 获取Twitter用户与Friends和Followers的关系(eg, 交集,差集)

    CODE: #!/usr/bin/python # -*- coding: utf-8 -*- ''' Created on 2014-7-30 @author: guaguastd @name: f ...