大公司面试经典数据结构与算法题C#解答

几个大公司(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 }
时间: 2024-12-28 00:20:21

大公司面试经典数据结构与算法题C#解答的相关文章

js面试中长见的算法题(转载)

js面试中长见的算法题 1.阐述下 JavaScript 中的变量提升 所谓提升,顾名思义即是 JavaScript 会将所有的声明提升到当前作用域的顶部.这也就意味着我们可以在某个变量声明前就使用该变量,不过虽然 JavaScript 会将声明提升到顶部,但是并不会执行真的初始化过程.2.阐述下 use strict; 的作用 use strict; 顾名思义也就是 JavaScript 会在所谓严格模式下执行,其一个主要的优势在于能够强制开发者避免使用未声明的变量.对于老版本的浏览器或者执行

JAVA集合类(大公司面试喜欢问的)

 分类: 核心JAVA(11)  版权声明:本文为博主原创文章,未经博主允许不得转载. 看了一些所谓大公司的Java面试问题,发现对于JAVA集合类的使用都比较看重似的,而自己在这方面还真的是所真甚少,抽空也学习学习吧. java.util包中就包含了一系列重要的集合类,而对于集合类,主要需要掌握的就是它的内部结构,以及遍历集合的迭代模式. 接口:Collection 所有集合类的根类型,主要的一个接口方法:boolean add(Ojbect c)虽返回的是boolean,但不是表示添加成功与

数据结构与算法题整理

未经各位前辈允许,擅自整理,还望谅解.感激不尽. ↓↓↓↓一一一2016.9.23 如何计算时间复杂度 平均查找长度详解 ↓↓↓↓一一一2016.9.15 找工作知识储备(3)---从头说12种排序算法:原理.图解.动画视频演示.代码以及笔试面试题目中的应用(该博主博客很多面试数据结构与算法方面的干货!推荐!) 找工作笔试面试那些事儿(15)---互联网公司面试的零零种种和多家经验(同为该博主,这篇讲大纲) ↓↓↓↓一一一2016.9.14 微软公司等数据结构+算法面试100题(第1-100题)

【JAVA集合类(大公司面试喜欢问的) 】

看了一些所谓大公司的JAVA面试问题,发现对于JAVA集合类的使用都比较看重似的,而自己在这方面还真的是所真甚少,抽空也学习学习吧. java.util包中包含了一系列重要的集合类,而对于集合类,主要需要掌握的就是它的内部结构,以及遍历集合的迭代模式. 接口:Collection Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements).一些Collection允许相同的元素而另一些不行.一些能排序而另一些不行.Jav

几个面试经典算法题Java解答

题目一: public class testClockwiseOutput { //顺时针打印一个矩阵 @Test public void test(){ int[][] num = new int[100][100]; int n = 4; int count =1; for(int i=0;i<n;i++){ for(int j =0;j<n;j++){ num[i][j]=count++; } } output(num,0,n-1); } public void output(int[]

面试汇总——社招算法题篇

面试结果 总结下最近的面试: 头条后端:3面技术面挂 蚂蚁支付宝营销-机器学习平台开发: 技术面通过,年后被通知只有P7的hc 蚂蚁中台-机器学习平台开发: 技术面通过, 被蚂蚁HR挂掉(脉脉上好多人遇到这种情况,一个是今年大环境不好,另一个,面试尽量不要赶上阿里财年年底,这算是一点tips吧) 快手后端: 拿到offer 百度后端: 拿到offer 最终拒了百度,去快手了, 一心想去阿里, 个人有点阿里情节吧,缘分差点. 总结下最近的面试情况, 由于面了20多面, 就按照题型分类给大家一个总结

游戏制作中的大宝剑---常用的数据结构与算法

前言 时间流逝,物是人非,就好像涌动的河流,永无终焉,幼稚的心智将变得高尚,青年的爱慕将变得深刻,清澈之水折射着成长. ----------<塞尔塔传说> PS:为了方便大家阅读,个人认为比较重要的内容-------红色字体显示 个人认为可以了解的内容-------紫色字体显示 --------------------------------------------------------------------------- ---------------------------------

大公司面试最爱问的5个ui设计师面试问题及答案

去两年,如果你留意过"互联网公司五大吃香岗位"."哪些新职业热门又多金"一类的排行帖,就会发现 UI设计师 这五个字长期霸榜前三.大量UI设计人员井喷式进入行业,但大多数人在工作一到两年后就尴尬地卡在个人能力与薪资水平的双重瓶颈,又纷纷动起了跳槽的念头. 然而此时更尴尬的局面出现了: 入行时间不长,积累的经验和创造的价值都不多,甚至没几件拿得出手的上线作品. 如果你还是个不太能说会道的人,那么很抱歉,想在下一份工作中拿高薪是没啥可能了. 这种情况下,该如何梳理自己上

求助大神们看下这道算法题

时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高位数字不为0. 因此,符合我们定义的最小的有趣的数是2013.除此以外,4位的有趣的数还有两个:2031和2301. 请计算恰好有n位的有趣的数的个数.由于答案可能非常大,只需要输出答案除以1000000007的余数. 输入格式 输入只有