几个大公司(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();
  14. list.Add();
  15. list.Add();
  16. list.Add();
  17. list.Add();
  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 = ; i < s.Length; i++)
  17. {
  18. if (hash.Contains(s[i]))
  19. {
  20. hash[s[i]] = (int)hash[s[i]]+;
  21. }
  22. else
  23. {
  24. hash[s[i]] = ;
  25. }
  26. }
  27. }
  28.  
  29. static char Search(string s)
  30. {
  31. for (int i = ; i < s.Length; i++)
  32. {
  33. if ((int)hash[s[i]] == )
  34. {
  35. return s[i];
  36. }
  37. }
  38. return '#';
  39. }
  40. }
  41. }

3.有一个已经排序的数组(升序),数组中可能有正数、负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现

基本原理:找到正负数分界点0,如果存在就是0,不存在就比较它左右两个数的绝对值。

(PS:为了方便我写到一个JUnit方法中)

  1. public class testAlgorithm {
  2. @Test
  3. public void Fun(){
  4. int[] a = {-8,-7,-5,1,3,5};
  5.  
  6. int middle = (a.length-1)/2;
  7. int result = middle;
  8.  
  9. if (a[middle]==0){
  10. System.out.println("The smallest number is "+a[middle]);
  11. return;
  12. }
  13. //find the demarcation point
  14. else{
  15. if(a[result]>0){
  16. while(a[result]>0){
  17. result = result - 1;
  18. }
  19. if(Math.abs(a[result])>a[result+1]){
  20. System.out.println("The smallest number is "+a[result+1]);
  21. return;
  22. }
  23. else{
  24. System.out.println("The smallest number is "+a[result]);
  25. return;
  26. }
  27. }
  28. else{
  29. while(a[result]<0){
  30. result = result + 1;
  31. }
  32. if(a[result]>Math.abs(a[result+1])){
  33. System.out.println("The smallest number is "+a[result+1]);
  34. return;
  35. }
  36. else{
  37. System.out.println("The smallest number is "+a[result]);
  38. return;
  39. }
  40. }
  41.  
  42. }
  43.  
  44. }
  45.  
  46. }

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

  1. 常见排序算法题(java版)

    常见排序算法题(java版) //插入排序:   package org.rut.util.algorithm.support;   import org.rut.util.algorithm.Sor ...

  2. [java大数据面试] 2018年4月百度面试经过+三面算法题:给定一个数组,求和为定值的所有组合.

    给定一个数组,求和为定值的所有组合, 这道算法题在leetcode应该算是中等偏下难度, 对三到五年工作经验主要做业务开发的同学来说, 一般较难的也就是这种程度了. 简述经过: 不算hr面,总计四面, ...

  3. C基础 北京大公司面试简单总结

    作者有话说 这是关于程序员面试的一篇文章, 希望对你有帮助. 干了快3年了. 可以简单参考, 对比总结.虽然本人很水. 很喜欢当前做的手游项目.做的很认真.后端每个人技术都很好.但是结果都不如意.在死 ...

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

     分类: 核心JAVA(11)  版权声明:本文为博主原创文章,未经博主允许不得转载. 看了一些所谓大公司的Java面试问题,发现对于JAVA集合类的使用都比较看重似的,而自己在这方面还真的是所真甚少 ...

  5. 面试必备:高频算法题终章「图文解析 + 范例代码」之 矩阵 二进制 + 位运算 + LRU 合集

    Attention 秋招接近尾声,我总结了 牛客.WanAndroid 上,有关笔试面经的帖子中出现的算法题,结合往年考题写了这一系列文章,所有文章均与 LeetCode 进行核对.测试.欢迎食用 本 ...

  6. php面试之数据结构和算法

    二.数据结构和算法 1.使对象可以像数组一样进行foreach循环,要求属性必须是私有.(Iterator模式的PHP5实现,写一类实现Iterator接口)(腾讯) <?php class T ...

  7. [2]十道算法题【Java实现】

    前言 清明不小心就拖了两天没更了-- 这是十道算法题的第二篇了-上一篇回顾:十道简单算法题 最近在回顾以前使用C写过的数据结构和算法的东西,发现自己的算法和数据结构是真的薄弱,现在用Java改写一下, ...

  8. 提前批笔试一道算法题的Java实现

    题目描述 这是2021广联达校招提前批笔试算法题之一. 我们希望一个序列中的元素是各不相同的,但是理想和显示往往是有差距的.现在给出一个序列A,其中难免有相同的元素,现在提供了一种变化方式,使得经过若 ...

  9. FPGA大公司面试笔试数电部分,看看你会多少

    1:什么是同步逻辑和异步逻辑?(汉王) 同步逻辑是时钟之间有固定的因果关系.异步逻辑是各时钟之间没有固定的因果关系. 答案应该与上面问题一致 [补充]:同步时序逻辑电路的特点:各触发器的时钟端全部连接 ...

随机推荐

  1. Thrift_简介(基于C#)

    //Server: TProtocolFactory ProtocolFactory = new TBinaryProtocol.Factory(true, true); TTransportFact ...

  2. 类似于PLC上升沿的TRIO代码示例

    需求:    一个自复位按钮,控制灯泡的亮与灭(按钮按一次灯亮,再按一次灯灭依次循环). 简短的代码,若大家有更好的思路可以评论区留言. DIM in_button,op_lamp,var_middl ...

  3. 利用阿里云的源yum方式安装Mongodb

    今天在线上服务器上安装MongoDB,从Mongo官网直接下载链接,结果在下载时发觉速度慢的可怜.迫于无奈,只能找国内的镜像下载.这里选择阿里云的源进行安装,记录如下: 1)在/etc/yum.rep ...

  4. open-falcon ---客户机agent操作

    open-falcon的agent用于采集机器负载监控指标,比如cpu.idle.load.1min.disk.io.util等等,每隔60秒push给Transfer.agent与Transfer建 ...

  5. HTTP请求头和响应头部包括的信息有哪些?

    每个HTTP请求和响应都会带有相应的头部信息.默认情况下,在发送XHR请求的同时,还会发送下列头部信息: Accept:浏览器能够处理的内容类型 Accept-Charset:浏览器能够显示的字符集 ...

  6. 个人对vuex的表象理解(笔记)

    一个东西,首先要知道为什么用它,为什么要vuex,官方解释为了解决繁杂事件订阅和广播,那么事件的$dispatch,$on,怎么就复杂了?许多人是不是感觉后者还挺简单的,对的 如果简单小型项目,那么不 ...

  7. 【2016.3.22】作业 Word count 小程序

    今天更下word count程序的设计思路及实现方法. 我的程序贴在coding里,这里就先不贴出来了, 我的coding地址:https://coding.net/u/holy_angel/p/wo ...

  8. 【Beta阶段】第八次Scrum Meeting!

    每日任务内容: 本次会议为第八次Scrum Meeting会议~ 由于本次会议项目经理身体不适,未参与会议,会议精神由卤蛋代为转达,其他同学一起参与了会议 队员 昨日完成任务 明日要完成任务 刘乾 今 ...

  9. Linux内核分析 读书笔记 (第四章)

    第四章 进程调度 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间.进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统.只有通过调度程序的合理调度,系统资源才能最大限 ...

  10. ajax多级菜单栏

    1.jsp 首先ajax查询数据 <script type="text/javascript"> function targetlist() { $.ajax({ ur ...