程序员面试的注意事项(二):面试需要的基础知识

程序员面试的注意事项(二):面试需要的基础知识

【版权申明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权);
本博客的内容来自于程序员面试的注意事项(二):面试需要的基础知识
学习、合作与交流联系q384660495;
本博客的内容仅供学习与参考,并非营利;


本文的内容主要总结了《剑指offer》,并非原创。

一、面试所需要的基本知识


提示:以下部分主要介绍了面试必须掌握的编程语言、数据结构、算法和数据操作等

1、面试官谈基础知识

  • 数据结构和算法******
  • 编程能力******
  • 部分数学知识,如概率**
  • 问题的分析和推理能力***
  • 算法时间、空间复杂度***
  • 并发控制
  • 语言的基本概念******

2、编程语言

程序员写代码总是基于某一种编程语言,因此技术面试的时候都会直接或者间接的涉及至少一种编程语言。提问的方式,要么直接问语言的语法,要么让应聘者用一种编程语言写代码解决一个问题(有的面试题会限制编程语言,建议多掌握一些语言)

这边推荐一些好的学习编程语言的网站:
菜鸟教程
JavaGuide

3、数据结构

数据结构一直是技术面试的重点,大部分面试题都是围绕着数组、字符串、链表、树、栈及队列这几种基本常见的数据结构展开的。数组和字符串是最基本的数据结构,它们用连续的内存分别存储数字和字符。链表和树是面试中出现频率最高的数据结构,由于操作链表和树需要用到大量指针,一定要留意代码的鲁棒性。栈是一个与递归紧密相关的数据结构,同样队列也与广度优先遍历算法紧密相关。

3.1、数组

数组的空间效率低

数组可以说是最简单的一种数据结构,它占据一块连续的内存并按照顺序存储数据。需要先指定数组的容量大小,然后根据大小分配内存。即使只在数组中存储一个数字,也需要为所有的数据预先分配内存。因此数组的空间效率不是很好,经常有空闲的区域没有利用。

数组的时间效率高

由于数组中的内存是连续的,可以根据下标在O(1)时间读/写任何元素,因此时间效率很高。我们可以根据数组时间效率高的特点,用数组来实现简单的哈希表:把数组的下标设为哈希表的键值(Key),而把数组中的每一个元素设为哈希表的值(Value)。有了这样的哈希表,我们就可以在O(1)时间内实现查找。

动态数组解决空间效率不高的问题

当数组元素数目超过数组的容量的时候,我们再重新开辟一个更大的空间,将之前的数据复制到新的数组中,再把之前的内存释放掉,这样就能减少内存的浪费。但是每一次扩容都要进行大量的额外操作,因此使用动态数组时要尽量减少改变数组容量大小的次数。

面试题一:数组中重复的数字
题目:找出数组中重复的数字。 在一个长度为n的数组里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但不知道哪些数字是重复的,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
例如:如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3

思路一:先对数组进行排序,从排序的数组中找出重复的数字是很容易的。排序数组的时间复杂度为O(nlogn),空间复杂度为O(1),排序算法可以参考我的这篇文章面试必会算法(1):排序算法

思路二:利用哈希表解决问题。从头到尾扫描数组的每一个数字,没扫描到一个数字的时候,都可以用O(1)的时间来判断哈希表里是否包含了该数字。该算法的时间复杂度为O(n),空间复杂度为O(n)。

思路三:重排这个数组。从头到尾依次扫描这个数组中的每一个数字。当扫描到下标为i的数字时,首先比较这个数字是不是等于i。如果是,则接着扫描下一个数字。如果不是,则再拿他和第m个数字进行比较。如果它和第m个数字相等,就找到了一个重复的数字;如果它和第m个数字不相等,就把第i个数字和第m个数字交换,把m放到属于它的位置。接下来再重复比较、交换的过程,直到我们发现一个重复的数字。

测试用例:1、包含一个或多个重复

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏天的爱人是绿色

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值