程序员为什么要学数据结构?

在计算机发展的初期,人们使用计算机的主要目的是处理数值计算问题。使用计算机解决具体问题一般需要经过以下几个步骤:首先从具体问题抽象出适当的数学模型,然后设计或选择解此数学模型的算法,接着编写程序并进行调试、测试,直至得到最终的解答。

由于最初涉及的运算对象是简单的整型、实型或布尔型数据,所以程序设计者的主要精力集中于程序设计的技巧上,而无需重视数据结构。随着计算机应用领域的扩大和软硬件的发展,非数值计算问题显得越来越重要,据统计,当今处理非数值计算问题占用了90%以上的机器时间。这类问题涉及的数据结构更为复杂,数据元素之间的相互关系一般无法用数学方程式加以描述。因此,解决这类问题的关键不再是数学分析和计算方法,而是要设计出合适的数据结构。

著名的瑞士计算机科学家沃思(N.Wirth)教授曾提出:算法 + 数据结构=程序
复制代码

程序设计的实质是对实际问题设计/选择好的数据结构和好的算法,而好的算法在很大程度上取决于描述实际问题的数据结构。

1、把二元查找树转变成排序的双向链表

**题目:**输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。

2、设计包含min 函数的栈

**题目:**定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素。要求函数min、push 以及pop 的时间复杂度都是O(1)。

3、求子数组的最大和

**题目:**输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。

4、在二元树中找出和为某一值的所有路径

**题目:**输入一个整数和一棵二元树,从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。

5、查找最小的k 个元素

**题目:**输入n 个整数,输出其中最小的k 个。

6、微软亚院之编程判断俩个链表是否相交

**题目:**给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交。为了简化问题,我们假设俩个链表均不带环。

问题扩展:

1.如果链表可能有环列?

2.如果需要求出俩个链表相交的第一个节点列?

7、判断整数序列是不是二元查找树的后序遍历结果

**题目:**输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。

8、输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。

9、输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。

10、输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。

11、n 个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m 个数字。求出在这个圆圈中剩下的最后一个数字。

12、定义Fibonacci 数列如下:

/ 0 n=0

f(n)= 1 n=1

\ f(n-1)+f(n-2) n=2

输入n,用最快的方法求该数列的第n 项。

分析:在很多C 语言教科书中讲到递归函数的时候,都会用Fibonacci 作为例子。

13、输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串"345",则输出整数345

14、链表操作

(1)单链表就地逆置

(2)合并链表

15、写一个函数,它的原形是int continumax(char *outputstr,char *intputstr)功能:在字符串中找出连续最长的数字串,并把这个串的长度返回,并把这个最长数字串付给其中一个函数参数outputstr 所指内存。

例如:"abcd12345ed125ss123456789"的首地址传给intputstr 后,函数将返回9,outputstr 所指的值为123456789

16、跳台阶问题

题目:一个台阶总共有n 级,如果一次可以跳1级,也可以跳2级。求总共有多少总跳法,并分析算法的时间复杂度。

17、整数的二进制表示中1 的个数

**题目:**输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。

分析:这是一道很基本的考查位运算的面试题

18、栈的push、pop 序列

**题目:**输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop 顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。

比如输入的push序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一个pop系列。因为可以有如下的push 和pop 序列:

push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop,pop,

这样得到的pop 序列就是4、5、3、2、1。但序列4、3、5、1、2 就不可能是push 序列1、2、3、4、5 的pop 序列。

19、在从1 到n 的正数中1 出现的次数输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1 到12 这些整数中包含1 的数字有1,10,11 和12,1 一共出现了5 次。

分析:这是一道广为流传的google 面试题。

20、求一个矩阵中最大的二维矩阵(元素和最大).如:

1 2 0 3 4

2 3 4 5 1

1 1 5 3 0

中最大的是:

4 5

5 3

要求:(1)写出算法;(2)分析时间复杂度;(3)用C 写出关键代码

21、谷歌笔试

n 支队伍比赛,分别编号为0,1,2。。。。n-1,已知它们之间的实力对比关系,存储在一个二维数组w[n][n]中,w[i][j] 的值代表编号为i,j的队伍中更强的一支。所以w[i][j]=i或者j,现在给出它们的出场顺序,并存储在数组order[n]中,比如order[n] = {4,3,5,8,1......},那么第一轮比赛就是4 对3, 5 对8。.......胜者晋级,败者淘汰,同一轮淘汰的所有队伍排名不再细分,即可以随便排,下一轮由上一轮的胜者按照顺序,再依次两两比,比如可能是4对5,直至出现第一名编程实现,给出二维数组w,一维数组order 和用于输出比赛名次的数组result[n],求出result。

22、有n 个长为m+1 的字符串,如果某个字符串的最后m个字符与某个字符串的前m个字符匹配,则两个字符串可以联接,问这n 个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误。

23、网易有道笔试

(1)求一个二叉树中任意两个节点间的最大距离,两个节点的距离的定义是这两个节点间边的个数,比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间空间复杂度。

(2)求一个有向连通图的割点,割点的定义是,如果除去此节点和与其相关的边,有向图不再连通,描述算法。

24、百度研发笔试题

(1)设计一个栈结构,满足一下条件:min,push,pop 操作的时间复杂度为O(1)。

(2)一串首尾相连的珠子(m 个),有N 种颜色(N<=10),设计一个算法,取出其中一段,要求包含所有N 中颜色,并使长度最短,并分析时间复杂度与空间复杂度。

(3))设计一个系统处理词语搭配问题,比如说中国和人民可以搭配,则中国人民人民中国都有效。要求:

*系统每秒的查询数量可能上千次;

*词语的数量级为10W;

*每个词至多可以与1W 个词搭配

当用户输入中国人民的时候,要求返回与这个搭配词组相关的信息。

25、递归和非递归俩种方法实现二叉树的前序遍历。

26、腾讯面试题

1、设计一个魔方(六面)的程序。

2、有一千万条短信,有重复,以文本文件的形式保存,一行一条,有重复。请用5分钟时间,找出重复出现最多的前10 条。

3、收藏了1 万条url,现在给你一条url,如何找出相似的url。(面试官不解释何为相似)

27、雅虎:

1、对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)某一个元素也加一,现给出一正数矩阵,判断其是否能够由一个全零矩阵经过上述运算得到。

2、一个整数数组,长度为n,将其分为m 份,使各份的和相等,求m 的最大值

比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1;

{3,6}{2,4,3} m=2

{3,3}{2,4}{6} m=3 所以m 的最大值为3。

28、微软

一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5}是由{6,5,4,3,2,1}左移两位形成的,在这种数组中查找某一个数。

29、1.求一个二叉树中任意两个节点间的最大距离,两个节点的距离的定义是这两个节点间边的个数,比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间空间复杂度。

2.求一个有向连通图的割点,割点的定义是,如果除去此节点和与其相关的边,有向图不再连通,描述算法。

30、和为n 连续正数序列

**题目:**输入一个正数n,输出所有和为n连续正数序列。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3 个连续序列1-5、4-6 和7-8。

数据结构与算法的重要性已不言而喻,最近,我特意整理出微软面试的100题,由于篇幅过长,将分开分享,若有不足之处,欢迎指正!很多人都会想要答案,但是我认为没有标准答案,答案表现的是个人思维,欢迎大家在评论区讨论,进行思维的碰撞。

如何学习才能快速入门并精通呢?

当真正开始学习时难免不知从何入手,从而导致效率低下影响继续学习的信心。

但最重要的是不知道需要重点掌握哪些技术,学习时频繁踩坑,最终浪费大量时间。

为了让学习变得轻松高效,现在给大家提供一个学习平台,让你在实践中积累经验掌握原理。主要方向是JAVA架构师,在这里你可以学习Java工程化、高性能及分布式、深入浅出、性能调优、Spring,MyBatis,Netty源码分析和大数据等知识点。可以加QQ:3136292260,或是关注微信公众号:Java资讯库,回复“架构”,免费的大型互联网Java技术视频分享给大家。

微软的100道算法面试题(一)相关推荐

  1. 微软的100道算法面试题(终结版)

    前言 数据结构与算法的重要性已不言而喻,最近,我整理出十大经典排序算法.五大常用算法总结,今天特意整理出微软面试的100题,若有不足之处,欢迎指正!由于篇幅过长,前30道题目写在上一篇,大家可以进我的 ...

  2. 200 道算法面试题集锦!Python 实现,含华为、BAT 等校招真题!

    点击上方"AI有道",选择"置顶"公众号 重磅干货,第一时间送达 春招临近,无论是要找工作的准毕业生,还是身在职场想要提升自己的程序员,提升自己的算法内功心法. ...

  3. 程序员应该掌握的经典算法面试题

    不忘初心,方得始终.何谓"初心"?初心便是在深度学习.人工智能呼风唤雨的时代,对数据和结论之间那条朴素之路的永恒探寻,是集前人之大智,真诚质朴求法向道的心中夙愿. 没有最好的分类器 ...

  4. 66 道前端算法面试题附思路分析助你查漏补缺

    大家好,我是漫步. 今天来分享一篇干货,前端关于算法的分析不多,下文列举了66道前端算法面试题,希望对你有所帮助. 作者:Eno_Yao https://segmentfault.com/a/1190 ...

  5. 一周刷爆LeetCode,算法da神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记

    一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记 教程与代码地址 P1 出圈了!讲课之外我们来聊聊 ...

  6. 数据结构经典算法面试题

    转自:http://hi.baidu.com/geogre_jsj/blog/item/e4b98fd2aab5aa3611df9b92.html 由于这些题,实在太火了.所以,应广大网友建议要求,在 ...

  7. [Z]谷歌(Google)算法面试题

    谷歌(Google)算法面试题 1.谷歌面试题:给定能随机生成整数 1 到 5 的函数,写出能随机生成整数 1 到 7 的函数. 回答:此题的关键是让生成的 1 到 7 的数出现概率相同. 只要我们可 ...

  8. twitter java_Twitter算法面试题详解(Java实现)

    最近在网上看到一道Twitter的算法面试题,网上已经有人给出了答案,不过可能有些人没太看明白(我也未验证是否正确),现在给出一个比较好理解的答案.先看一下题目. 图1 先看看图图1.可以将方块看做砖 ...

  9. java面笔试_java笔试手写算法面试题大全含答案

    java笔试手写算法面试题大全含答案 1.统计一篇英文文章单词个数. public class WordCounting { public static void main(String[] args ...

最新文章

  1. 网络带宽与传输性能的基本计算方法
  2. Ubuntu(Linux) 下 unzip 命令使用详解
  3. liferay笔记之copy-request-parameters
  4. Android中广播接收者BroadcastReceiver详解
  5. mysql一对一级联_MySQL 表的一对一、一对多、多对多问题
  6. python里面的list
  7. 第二届数据科学家大会日程发布,9月20-21日在桂林等您~
  8. 【目标检测实战】目标检测实战之一--手把手教你LMDB格式数据集制作!
  9. linux内存报警,linux 邮件报警,监控内存cup
  10. 再谈Bellman-Ford
  11. 未经专业销密的计算机设备,DOC1-题
  12. JavaScript - 理解面向对象编程
  13. MD5加密、Base64加密解密
  14. python程序设计pdf上海交大_上海交大2011_2012程序设计python期末考试题
  15. 服务器修改ip socket,socket不能选择本地IP连接的解决方法
  16. 晶体管放大电路与Multisim仿真学习笔记
  17. 易语言斗鱼弹幕助手源码
  18. android外接键盘打汉字,外接键盘情况下,安卓打字不如windows
  19. 设计模式简介 - Introduction to Design Patterns
  20. 腾讯开放平台创建应用安卓和iOS端如何共用同一个Appid?

热门文章

  1. c++多字节与宽字节字符串转换(windows平台)
  2. Windows 2008-IIS 7.0-SSL操作大全
  3. 加快发展设施业 农业大健康-林裕豪:从玉农业践行基础支撑
  4. 最新鲜最详细的Android SDK下载安装及配置教程
  5. 悲观锁和乐观锁的详细分析
  6. 日期时间格式加减操作
  7. Python之旅:列表
  8. asp.net内置对象
  9. git命令查看远程分支
  10. 黑马程序员的课程不如兄弟连兄弟会好