算法题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#解答

摘要: 几个大公司(IBM、MicroSoft and so on)面试经典数据结构与算法题C#解答1.链表反转我想到了两种比较简单的方法第一种是需要开一个新的链表,将原链表的元素从后到前的插入到新链表中(也就是原链表第一个元素被插入成新链表的最后一个元素)。第二种是不需要开新的链表,而是逐步反转原链表中元...阅读全文

posted @ 2015-05-03 20:43 Sunnier 阅读(352) | 评论 (0) 编辑

常用数据结构及算法C#实现

摘要: 常用数据结构及算法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) 编辑

分类: 数据结构及算法

时间: 2024-10-06 23:17:23

算法题C#的相关文章

笔试算法题(09):查找指定和值的两个数 &amp; 构造BST镜像树

出题:输入一个已经升序排序的数组和一个数字:要求在数组中查找两个数,这两个数的和正好等于输入的那个数字,输出任意一对数字就可以,要求时间复杂度是O(n): 分析:对于升序排序的数组{-i-j-k-m--},只有可能是i+m=j+k(j和k可能是同一个数),所以可以从两边往中间收缩而忽视其他交叉相加的情况: 解题: 1 void FindSumFactor(int *array, int length, int sum) { 2 int left=0, right=length-1; 3 whil

笔试算法题(08):输出倒数第K个节点

出题:输入一个单向链表,要求输出链表中倒数第K个节点 分析:利用等差指针,指针A先行K步,然后指针B从链表头与A同步前进,当A到达链表尾时B指向的节点就是倒数第K个节点: 解题: 1 struct Node { 2 int v; 3 Node *next; 4 }; 5 Node* FindLastKth(Node *head, int k) { 6 if(head==NULL) { 7 printf("\nhead is NULL\n"); 8 exit(0); 9 } 10 Nod

笔试算法题(07):还原后序遍历数组 &amp; 半翻转英文句段

出题:输入一个整数数组,判断该数组是否符合一个二元查找树的后序遍历(给定整数数组,判定其是否满足某二元查找树的后序遍历): 分析:利用后序遍历对应到二元查找树的性质(序列最后一个元素必定是根节点,从左向右第一个比根节点大的元素开始直到根节点之前的所有元素必定在右子树,之前的所有元素必定在左子树): 解题: 1 bool PostOrderCheck(int *array, int i, int j) { 2 /** 3 * 如快速排序一样,解决小子文件 4 * */ 5 if(j-i+1 ==

java基础算法题

为了提高自己的代码能力和算法能力,我决定每天学习一道算法题,吸收前辈思想. [程序1] TestRabbit.java 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 程序分析:兔子数量的规律为数列:1,1,2,3,5,8,13.....其实就是斐波那契数列  使用递归就可以实现 1 /** 2 * 兔子问题 3 * 2016/5/9 4 * 斐波那契数列求值 5 *题目:古典问题:有一对兔子,

ios 算法题

1兔子算法题 兔子可以跳一步2步或者3步,问跳到100有多少种跳法? // 兔子可以跳一步2步或者3步 // 问跳到100有几种跳法 /* 分析1 两个变量,X*2+Y*3=100. X最大为50,X最小为2 Y最大为32.最小为0 分析2 某个情景分析:假设X=35,Y为10时, 虽然知道了数量,但是兔子的35小步,和10大步的顺序是怎样的? 应为组合-> 45个节点中,选择10个放三步的.那就是简单的C(45 10).变成阶乘,就解得出来. */ double temp=0.0f; for

[solution]腾讯TEG_计算广告组_算法题

度娘笔试归来,题目实打实的,感觉真心不易,上百号人就抢那么几个坑......只恨自己平时积累太少啊~ 故曝一道鹅厂面试用的算法题(当时我就死在了这题上),来为度娘家攒一下RP~ 题目: 对于长度为N的一个无序的数组a[1..N],请将a进行排序,要求所有正数都排在0之前,所有负数都排在0之后(如果没有0,则所有正数排在负数前) 要求时间复杂度O(N),空间复杂度O(1) 题目不难,但给思考的时间很短,大约不到5分钟吧.当时脑子比较短路,于是只给出了O(n) O(n)复杂度的算法,然后就被面试官挂

算法题——翻转链表中的一段

题目:给出一个链表中的两个指针p1和p2,将其之间的结点翻转. 思路:可以通过交换结点内的值来实现结点的翻转,空间为O(N):如果要求不能交换值,那么仅凭p1和p2是无法翻转的,只能交换两个指针之间的链表. 代码: 交换值: 1 struct ListNode 2 { 3 int val; 4 ListNode *next; 5 }; 6 7 void reverseNodes(ListNode *p1, ListNode *p2) { 8 if ( p1 == NULL || p2 == NU

算法题:求数组中最小的k个数

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 题目:输入n个整数,找出其中最小的k个数. <剑指offer>给出了两种实现算法: 算法1:采用Partition+递归法,该算法可以说是快速排序和二分查找的有机结合.算法的时间复杂度为O(n),缺点在于在修改Partition的过程中会修改原数组的值. 算法2:采用top-k算法.如果要找最小的K个数,我们才用一个含有K个值的大顶堆:如果要找最大的K个数,我们采用小顶堆.该算法的时间复杂度为O(nlogK),是一种比较好的算法,启发于堆排序

一天一道算法题---6.26---二分查找

感谢微信平台---一天一道算法题----每天多一点进步-- 好累啊  现在在用win7自带的输入法 打起来真麻烦 快点把这2天的搞完就重装了 还是直接来源于----〉 待字闺中 分析 给定一个数组A,其中有一个位置被称为Magic Index,含义是:如果i是Magic Index,则A[i] = i.假设A中的元素递增有序.且不重复,请给出方法,找到这个Magic Index.更进一步,当A中允许有重复的元素,该怎么办呢? 没有重复元素的情况 一些同学在遇到这个题目的时候,往往会觉得比较简单.

一天一道算法题--6.25--无定义

感谢微信平台---一天一道算法题--每天多一点进步---- 其实今天我接下去补上的几题都来自---待字闺中 所以我就原封不动的将它的题目与分析搬过来了 原题 给定一个数组,我们可以找到两个不相交的.并且是连续的子数组A和B,A中的数字和为sum(A), B中的元素和为sum(B).找到这样的A和B,满足sum(A) - sum(B)的绝对值是最大的. 例如:[2, -1 -2, 1, -4, 2, 8]划分为A=[-1, -2, 1, -4], B=[2, 8], 最大的值为16 分析 如果没有