算法题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 }
随笔分类 - 数据结构及算法
算法题C#的更多相关文章
- 一道java算法题分析
最近在面试中遇到这样的一道算法题: 求100!的结果的各位数之和为多少? 如:5!=5*4*3*2*1=120,那么他们的和为1+2+0=3这道题不算难,不过倒是注意的细节也有 ...
- FCC上的初级算法题
核心提示:FCC的算法题一共16道.跟之前简单到令人发指的基础题目相比,难度是上了一个台阶.主要涉及初步的字符串,数组等运算.仍然属于基础的基础,官方网站给出的建议完成时间为50小时,超出了之前所有非 ...
- 解决一道leetcode算法题的曲折过程及引发的思考
写在前面 本题实际解题过程是 从 40秒 --> 24秒 -->1.5秒 --> 715ms --> 320ms --> 48ms --> 36ms --> ...
- js 中的算法题,那些经常看到的
js中遇到的算法题不是很多,可以说基本遇不到.但面试的时候,尤其是一些大公司,总是会出这样那样的算法题,考察一个程序员的逻辑思维能力.如下: 1.回文. 回文是指把相同的词汇或句子,在下文中调换位置或 ...
- JavaScript算法题之–随机数的生成
JavaScript算法题之–随机数的生成 需求描述:从一组有序的数据中生成一组随机并且不重复的数,类似于简单的抽奖程序的实现. 先来生成一个有序的数组: 1 var arr = [], 2 ...
- 简单的算法题, Find Minimum in Rotated Sorted Array 的Python实现。
简单的算法题, Find Minimum in Rotated Sorted Array 的Python实现. 题目: Suppose a sorted array is rotated at som ...
- 经典算法题每日演练——第十七题 Dijkstra算法
原文:经典算法题每日演练--第十七题 Dijkstra算法 或许在生活中,经常会碰到针对某一个问题,在众多的限制条件下,如何去寻找一个最优解?可能大家想到了很多诸如“线性规划”,“动态规划” 这些经典 ...
- 经典算法题每日演练——第十六题 Kruskal算法
原文:经典算法题每日演练--第十六题 Kruskal算法 这篇我们看看第二种生成树的Kruskal算法,这个算法的魅力在于我们可以打一下算法和数据结构的组合拳,很有意思的. 一:思想 若存在M={0, ...
- 经典算法题每日演练——第十四题 Prim算法
原文:经典算法题每日演练--第十四题 Prim算法 图论在数据结构中是非常有趣而复杂的,作为web码农的我,在实际开发中一直没有找到它的使用场景,不像树那样的频繁使用,不过还是准备 仔细的把图论全部过 ...
- 经典算法题每日演练——第十一题 Bitmap算法
原文:经典算法题每日演练--第十一题 Bitmap算法 在所有具有性能优化的数据结构中,我想大家使用最多的就是hash表,是的,在具有定位查找上具有O(1)的常量时间,多么的简洁优美, 但是在特定的场 ...
随机推荐
- 介绍一款轻量级js控件:easy.js
easy.js 组件高速入门 在使用 easy.js 的组件之前,假设能花上几分钟看看以下的一些简单的入门指南,在使用组件的时候你会更加的得心应手. 简单性 easy.js 的组件在 UI(界面) 层 ...
- HTML基本介绍
html 即 超文本标记语言 ,即标准通用标记语言下的一个应用. "超文本"就是指页面内能够包括图片.链接.甚至音乐.程序等非文字元素.超文本标记语言的结构包括"头&qu ...
- HDU 5050 Divided Land(进制转换)
题意 给你两个二进制数m,n 求他们的最大公约数 用二进制表示 0<m,n<2^1000 先把二进制转换为十进制 求出最大公约数 再把结果转换为二进制 数比較大要用到大数 ...
- uitableView 选择跳过后, 跳回 颜色变化 问题
今天遇到这个问题 谁也因此没有满足这方面的需求 今天会见 网上办理登机手续 未找到 好 我只能说自己的问题 但 幸好,kai哥 就攻克了 ! 就是在- (void)tableView:(UITabl ...
- Java中Integer类的方法
java.lang 类 Integer java.lang.Object java.lang.Number java.lang.Integer 全部已实现的接口: Serializable, Comp ...
- ThinkPad E530 Fedora 20 无线上网问题
它一直在使用 Fedora 家庭 Linux. 但它自带的无线网卡驱动似下一些问题,通常,有时连接,有时你不能. 经常搜索不到的家用无线路由器. 因为家里有网线所以一直没有在意.没什么事就折腾了一下. ...
- Visual Studio 2015 中文企业版及专业版 正式版下载地址 激活秘钥 正版key
Visual Studio 简体中文企业版 2015 (x86 and x64)文件名 cn_visual_studio_enterprise_2015_x86_x64_dvd_6846222.iso ...
- lintcode 1: Data Stream Median
Data Stream Median Numbers keep coming, return the median of numbers at every time a new number adde ...
- Jafka来源分析——Processor
Jafka Acceptor接受client而建立后的连接请求,Acceptor会将Socket连接交给Processor进行处理.Processor通过下面的处理步骤进行client请求的处理: 1 ...
- NetBeans工具学习之道:NetBeans IDE Java 高速新手教程
欢迎使用 NetBeans IDE! 本教程通过指导您创建一个简单的 "Hello World" Java 控制台应用程序,简要介绍 NetBeans IDE 工作流.学习完本教程 ...