几个大公司(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。

 namespace 链表反转
{
class Node
{
public int Num { get; set; }
public Node Next { get; set; }
}
class Program
{
static void Main(string[] args)
{
NodeList list = new NodeList();
list.Add();
list.Add();
list.Add();
list.Add();
list.Add();
list.Reverse1();
list.Print(); NodeList list1 = list.Reverse();
list1.Print(); Console.ReadKey();
}
} class NodeList
{
public Node Head { get; set; }
public void Add(int num)
{
if (Head == null)
{
Head = new Node();
Head.Next = new Node() { Num = num };
}
else
{
Node tn = Head;
while (tn.Next != null)
{
tn = tn.Next;
}
tn.Next = new Node() { Num = num };
}
} public void Print()
{
Node tn = Head;
while(tn.Next!=null)
{
tn = tn.Next;
Console.WriteLine(tn.Num);
}
} //需要开新链表的反转
public NodeList Reverse()
{
NodeList list = new NodeList();
Node tn = Head;
Node newTn = null;
while (tn.Next != null)
{
tn = tn.Next;
if (newTn == null)
{
newTn = new Node() { Num = tn.Num };
}
else
{
newTn = new Node() { Num = tn.Num,Next=newTn };
}
}
list.Head = new Node();
list.Head.Next = newTn;
return list;
} //不需要开新链表的反转
public void Reverse1()
{
Node n1 = Head.Next;
Node n2 = Head.Next.Next;
//第一个节点也就是反转后的最后一个节点,Next要指向null
Node first = Head.Next;
first.Next = null;
//如果链表为空或者链表只有一个元素那就无需调整
if (n2 == null || n1 ==null)
{
return;
}
//先用Head指向n2的下一个元素,再将n2的Next指向n1,最后将n1和n2向右移动
while (n2.Next != null)
{
Head.Next = n2.Next;
n2.Next = n1;
n1 = n2;
n2 = Head.Next;
}
//最后要将头结点指向链表反转前的最后一个元素
Head.Next = n2;
//因为判断条件只调整到最后一个元素的前一个元素,所以要调整最后一个元素的Next指向
n2.Next = n1;
}
}

2.字符串查找第一个不重复的字母

基本原理:第一遍遍历字符串时,用hash表存储每个字符出现的次数,第二遍遍历字符串时,筛选出第一个hash中对应保存的出现次数为1的字符。

 namespace 字符串查找第一个不重复的字母
{
class Program
{
static Hashtable hash = new Hashtable();
static void Main(string[] args)
{
string s = "asfgasjfoiwoeqkwzxc";
Count(s);
Console.WriteLine(Search(s));
Console.ReadKey();
} static void Count(string s)
{
for (int i = ; i < s.Length; i++)
{
if (hash.Contains(s[i]))
{
hash[s[i]] = (int)hash[s[i]]+;
}
else
{
hash[s[i]] = ;
}
}
} static char Search(string s)
{
for (int i = ; i < s.Length; i++)
{
if ((int)hash[s[i]] == )
{
return s[i];
}
}
return '#';
}
}
}

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

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

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

public class testAlgorithm {
@Test
public void Fun(){
int[] a = {-8,-7,-5,1,3,5}; int middle = (a.length-1)/2;
int result = middle; if (a[middle]==0){
System.out.println("The smallest number is "+a[middle]);
return;
}
//find the demarcation point
else{
if(a[result]>0){
while(a[result]>0){
result = result - 1;
}
if(Math.abs(a[result])>a[result+1]){
System.out.println("The smallest number is "+a[result+1]);
return;
}
else{
System.out.println("The smallest number is "+a[result]);
return;
}
}
else{
while(a[result]<0){
result = result + 1;
}
if(a[result]>Math.abs(a[result+1])){
System.out.println("The smallest number is "+a[result+1]);
return;
}
else{
System.out.println("The smallest number is "+a[result]);
return;
}
} } } }

大公司面试经典数据结构与算法题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. 因写太多 BUG!程序员遭公司颁奖羞辱,做的一个比一个绝​

    刚入职的程序员新人,办公桌上,基本上也就一电脑.一键盘.一鼠标,再配个被杯子.然而混迹职场多年的猿老们,办公桌上都有一些彰显身份地位的“好东西”. 这张图两点颇多,最显眼的,是办公桌上那个黄黄的东西, ...

  2. C#断点续传下载。

    断点续传 最近在优化之前的下载流程,仅此篇幅留作笔记之用,日后其他研究此类问题的伙伴可以马上了解原理和开发,减少开发成本. 原理:断点续传目前比较通用的是使用HTTP续传方式,相关的资料可以通过访问: ...

  3. 分布式监控系统Zabbix-3.0.3-完整安装记录 - 添加shell脚本监控

    对公司的jira访问状态进行监控,当访问状态返回值是200的时候,脚本执行结果为1:其他访问状态返回值,脚本执行结果是0.然后将该脚本放在zabbix进行监控,当非200状态时发出报警.jira访问状 ...

  4. css3 动画效果实现

    前沿 在工作中,经常有一些需要切换的交互样式.如果直接在两种状态之间切换,就显得有点生硬.加上一些动画效果就会好很多. 示例1:点击的三角切换 实现过程 第一步实现这个三角形 用的svg 的多边形画法 ...

  5. KETTLE集群搭建

    KETTLE集群搭建 说明: 本文档基于kettle5.4 一.集群的原理与优缺点 1.1集群的原理 Kettle集群是由一个主carte服务器和多个从carte服务器组成的,类似于master-sl ...

  6. 继承:call、apply、bind方法

    javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向. call,apply,bind这 ...

  7. 美团外卖app可行性分析

    美团外卖app可行性分析 1 引言 1.1编写目的 年轻人追求时尚,快捷,因此外卖行业拥有广阔的消费群体:团购的兴起,也促进了人们的消费欲望,人们继续一个外卖平台,来满足他们的欲望.O2o模式的日渐完 ...

  8. Which path should be used jdk or jre for JAVA_HOME environment variable?

    https://stackoverflow.com/questions/17601827/which-one-should-java-home-to-point-jdk-or-jre 临时变更JAVA ...

  9. zookeeper和kafka的安装

    一.安装zookeeper yum install -y java ##安装jdk1.6版本以上 wget http://mirror.bit.edu.cn/apache/zookeeper/zook ...

  10. 无返回值的异步方法能否不用await

    1.无返回值的异步方法能否不用await? 如果你不需要等待加一的操作完成,那就可以直接执行后面的操作.那要看你的需求了,如果你后面的操作必须在加一的操作后执行,那就要await了 2.请问C#中如何 ...