编程面试过程中最常见的10大算法

编程语言:C/C++

1. 字符串

如果IDE没有代码自动补全功能,所以你应该记住下面的这些方法。

toCharArray() // 获得字符串对应的char数组

Arrays.sort()  // 数组排序

Arrays.toString(char[] a) // 数组转成字符串

charAt(int x) // 获得某个索引处的字符

length() // 字符串长度

length // 数组大小

2. 链表

在Java中,链表的实现非常简单,每个节点Node都有一个值val和指向下个节点的链接next。

class Node {

int val;

Node next;

Node(int x) {

val = x;

next = null;

}

}

链表两个著名的应用是栈Stack和队列Queue。

栈:

class Stack{

Node top;

public Node peek(){

if(top != null){

return top;

}

return null;

}

public Node pop(){

if(top == null){

return null;

}else{

Node temp = new Node(top.val);

top = top.next;

return temp;

}

}

public void push(Node n){

if(n != null){

n.next = top;

top = n;

}

}

}

队列:

class Queue{

Node first, last;

public void enqueue(Node n){

if(first == null){

first = n;

last = first;

}else{

last.next = n;

last = n;

}

}

public Node dequeue(){

if(first == null){

return null;

}else{

Node temp = new Node(first.val);

first = first.next;

return temp;

}

}

}

3. 树

这里的树通常是指二叉树,每个节点都包含一个左子节点和右子节点,像下面这样:

class TreeNode{

int value;

TreeNode left;

TreeNode right;

}

下面是与树相关的一些概念:

平衡 vs. 非平衡:平衡二叉树中,每个节点的左右子树的深度相差至多为1(1或0)。

满二叉树(Full Binary Tree):除叶子节点以为的每个节点都有两个子节点。

完美二叉树(Perfect Binary Tree):是具有下列性质的满二叉树:所有的叶子节点都有相同的深度或处在同一层次,且每个父节点都必须有两个孩子。

完全二叉树(Complete Binary Tree):二叉树中,可能除了最后一个,每一层都被完全填满,且所有节点都必须尽可能想左靠。

译者注:完美二叉树也隐约称为完全二叉树。完美二叉树的一个例子是一个人在给定深度的祖先图,因为每个人都一定有两个生父母。完全二叉树可以看成是可以有若干额外向左靠的叶子节点的完美二叉树。疑问:完美二叉树和满二叉树的区别?(参考:http://xlinux.nist.gov/dads/HTML/perfectBinaryTree.html)

4. 图

图相关的问题主要集中在深度优先搜索(depth first search)和广度优先搜索(breath first search)。

下面是一个简单的图广度优先搜索的实现。

1) 定义GraphNode

class GraphNode{

int val;

GraphNode next;

GraphNode[] neighbors;

boolean visited;

GraphNode(int x) {

val = x;

}

GraphNode(int x, GraphNode[] n){

val = x;

neighbors = n;

}

public String toString(){

return "value: "+ this.val;

}

}

2) 定义一个队列Queue

class Queue{

GraphNode first, last;

public void enqueue(GraphNode n){

if(first == null){

first = n;

last = first;

}else{

last.next = n;

last = n;

}

}

public GraphNode dequeue(){

if(first == null){

return null;

}else{

GraphNode temp = new GraphNode(first.val, first.neighbors);

first = first.next;

return temp;

}

}

}

3) 用队列Queue实现广度优先搜索

public class GraphTest {

public static void main(String[] args) {

GraphNode n1 = new GraphNode(1);

GraphNode n2 = new GraphNode(2);

GraphNode n3 = new GraphNode(3);

GraphNode n4 = new GraphNode(4);

GraphNode n5 = new GraphNode(5);

n1.neighbors = new GraphNode[]{n2,n3,n5};

n2.neighbors = new GraphNode[]{n1,n4};

n3.neighbors = new GraphNode[]{n1,n4,n5};

n4.neighbors = new GraphNode[]{n2,n3,n5};

n5.neighbors = new GraphNode[]{n1,n3,n4};

breathFirstSearch(n1, 5);

}

public static void breathFirstSearch(GraphNode root, int x){

if(root.val == x)

System.out.println("find in root");

Queue queue = new Queue();

root.visited = true;

queue.enqueue(root);

while(queue.first != null){

GraphNode c = (GraphNode) queue.dequeue();

for(GraphNode n: c.neighbors){

if(!n.visited){

System.out.print(n + " ");

n.visited = true;

if(n.val == x)

System.out.println("Find "+n);

queue.enqueue(n);

}

}

}

}

}

Output:

1

2

value: 2 value: 3 value: 5 Find value: 5

value: 4

5. 排序

下面是不同排序算法的时间复杂度,你可以去wiki看一下这些算法的基本思想。

Algorithm Average Time Worst Time Space

冒泡排序 n^2 n^2 1

选择排序 n^2 n^2 1

Counting Sort n+k n+k n+k

Insertion sort n^2 n^2

Quick sort n log(n) n^2

Merge sort n log(n) n log(n) depends

另外,这里有一些实现/演示:: Counting sort、Mergesort、 Quicksort、 InsertionSort。

6. 递归 vs. 迭代

对程序员来说,递归应该是一个与生俱来的思想(a built-in thought),可以通过一个简单的例子来说明。

问题: 有n步台阶,一次只能上1步或2步,共有多少种走法。

步骤1:找到走完前n步台阶和前n-1步台阶之间的关系。

为了走完n步台阶,只有两种方法:从n-1步台阶爬1步走到或从n-2步台阶处爬2步走到。如果f(n)是爬到第n步台阶的方法数,那么f(n) = f(n-1) + f(n-2)。

步骤2: 确保开始条件是正确的。

f(0) = 0;

f(1) = 1;

public static int f(int n){

if(n <= 2) return n;

int x = f(n-1) + f(n-2);

return x;

}

递归方法的时间复杂度是n的指数级,因为有很多冗余的计算,如下:

f(5)

f(4) + f(3)

f(3) + f(2) + f(2) + f(1)

f(2) + f(1) + f(1) + f(0) + f(1) + f(0) + f(1)

f(1) + f(0) + f(1) + f(1) + f(0) + f(1) + f(0) + f(1)

直接的想法是将递归转换为迭代:

public static int f(int n) {

if (n <= 2){

return n;

}

int first = 1, second = 2;

int third = 0;

for (int i = 3; i <= n; i++) {

third = first + second;

first = second;

second = third;

}

return third;

}

对这个例子而言,迭代花费的时间更少,你可能也想看看Recursion vs Iteration。

7. 动态规划

动态规划是解决下面这些性质类问题的技术:

一个问题可以通过更小子问题的解决方法来解决(译者注:即问题的最优解包含了其子问题的最优解,也就是最优子结构性质)。

有些子问题的解可能需要计算多次(译者注:也就是子问题重叠性质)。

子问题的解存储在一张表格里,这样每个子问题只用计算一次。

需要额外的空间以节省时间。

爬台阶问题完全符合上面的四条性质,因此可以用动态规划法来解决。

public static int[] A = new int[100];

public static int f3(int n) {

if (n <= 2)

A[n]= n;

if(A[n] > 0)

return A[n];

else

A[n] = f3(n-1) + f3(n-2);//store results so only calculate once!

return A[n];

}

8. 位操作

位操作符:

OR (|) AND (&) XOR (^) Left Shift (<<) Right Shift (>>) Not (~)

1|0=1 1&0=0 1^0=1 0010<<2=1000 1100>>2=0011 ~1=0

获得给定数字n的第i位:(i从0计数并从右边开始)

public static boolean getBit(int num, int i){

int result = num & (1<<i);

if(result == 0){

return false;

}else{

return true;

}

例如,获得数字10的第2位:

i=1, n=10

1<<1= 10

1010&10=10

10 is not 0, so return true;

9. 概率问题

解决概率相关的问题通常需要很好的规划了解问题(formatting the problem),这里刚好有一个这类问题的简单例子:

一个房间里有50个人,那么至少有两个人生日相同的概率是多少?(忽略闰年的事实,也就是一年365天)

计算某些事情的概率很多时候都可以转换成先计算其相对面。在这个例子里,我们可以计算所有人生日都互不相同的概率,也就是:365/365 * 364/365 * 363/365 * … * (365-49)/365,这样至少两个人生日相同的概率就是1 – 这个值。

public static double caculateProbability(int n){

double x = 1;

for(int i=0; i<n; i++){

x *=  (365.0-i)/365.0;

}

double pro = Math.round((1-x) * 100);

return pro/100;

calculateProbability(50) = 0.97

10. 排列组合

组合和排列的区别在于次序是否关键。

转载于:https://www.cnblogs.com/Thor4356/p/6528512.html

编程面试过程中最常见的10大算法相关推荐

  1. java面试算法总结_java编程面试过程中常见的10大算法概念汇总

    以下是在编程面试中排名前10的算法相关的概念,我会通过一些简单的例子来阐述这些概念.由于完全掌握这些概念需要更多的努力,因此这份列表只是作为一个介绍.本文将从Java的角度看问题,包含下面的这些概念: ...

  2. 鸿钧老祖 数据结构笔记01:编程面试过程中常见的10大算法(java)

    以下是在编程面试中排名前10的算法相关的概念,我会通过一些简单的例子来阐述这些概念.由于完全掌握这些概念需要更多的努力,因此这份列表只是作为一个介绍.本文将从Java的角度看问题,包含下面的这些概念: ...

  3. 第一篇博客--记面陌陌科技计算机视觉算法工程师被刷经历(附面试过程中被问倒的一些算法题分析)...

    求职季,真的会让一个人变得有些不一样吧,比如我,对于一个菜鸟来说,最近一段时间焦虑不安外加有点自闭... 前段时间在校内网上看到了陌陌科技内推计算机视觉算法工程师和机器学习算法工程师的消息,抱着试试的 ...

  4. 记面陌陌科技计算机视觉算法工程师被刷经历(附面试过程中被问倒的一些算法题分析)

    转载过来的,原文:https://www.cnblogs.com/aoanng/p/9581612.html 求职季,真的会让一个人变得有些不一样吧,比如我,对于一个菜鸟来说,最近一段时间焦虑不安外加 ...

  5. (面经总结)一篇文章带你整理面试过程中常考的九大排序算法

    文章目录 一.二分插入排序 1. 原理 2. 代码 二.冒泡排序 1. 原理 2. 代码 三.插入排序算法 1. 原理 2. 代码 四.快速排序算法 1. 原理 2. 代码 五.希尔排序 1. 原理 ...

  6. 总结前端面试过程中最容易出现的问题

    前言 之前在兴安得力的时候,我也出过前端的面试题.那么前端人员在外面面试的时候,一般技术人员都会考察我们那些地方呢?我在这里不妨总结一下!(PS:有点小邪恶,这个公开之后,对于面试者来说是方便了.但是 ...

  7. 十大面试问题解惑,秒杀一切HR、技术面试。程序员必读! 最能体现求职者能力的就是面试,能不能拿到Offer,取决于你面试时的表现,只有有准备才能在面试过程中游刃有余。小编收集了10个面试官最爱提的问题

    十大面试问题解惑,秒杀一切HR.技术面试.程序员必读! 最能体现求职者能力的就是面试,能不能拿到Offer,取决于你面试时的表现,只有有准备才能在面试过程中游刃有余.小编收集了10个面试官最爱提的问题 ...

  8. 记一次面试过程中的Python编程题

    这几天面试过程中遇到一道Python编程题,题目如下: 面试中遇到一个Python编程问题:一个字符串,将里面的数字取出来,如果第一个数字前面是+,表示整个数字为正数,如果第一个数字前面是-,表示数字 ...

  9. C#编程中最常见的10个错误

    C#编程中最常见的10个错误 英文原文链接:https://www.toptal.com/c-sharp/top-10-mistakes-that-c-sharp-programmers-make 原 ...

最新文章

  1. 美团开源Logan Web:前端日志在Web端的实现
  2. 【Python游戏】推箱子—老少皆宜的益智游戏,看你能过几关?
  3. 【综述专栏】自动驾驶中可解释AI的综述和未来研究方向
  4. httpd 处理模型
  5. 如何在linux下启动和关闭oracle服务
  6. Dart基础-泛型和库
  7. salt-API基本验证命令
  8. php花店会员信息管理系统,PHP网上花店管理系统
  9. opencv 图片边缘渐变_opencv滤镜-PS羽化特效
  10. 用python画卡通图_需要用Python和OpenCV制作一张卡通漫画版的图片
  11. 双十一游戏发烧友都在推荐的电子竞技显示器
  12. 【公告】博客新皮肤上线啦
  13. java JVM调优总结 -Xms -Xmx -Xmn -Xss
  14. java 函数表_C语言、Java语言的符号表区别和特点是什么?分别是如和处理函数参数的?...
  15. 解决联想拯救者显卡花屏
  16. 什么是ui设计师:ui设计学什么内容
  17. PHP修改根目录路径
  18. BUMO:超级节点共建接口
  19. 系统重装 如何在PC上安装Mac OS,苹果操作系统
  20. mysql查询依赖的ID_为什么peewee在mysql select查询中包含'id'列?

热门文章

  1. 跨终端响应式页面设计入门
  2. SQL 2014 in-memory中的storage部分
  3. 红茶一杯话Binder(传输机制篇_上)
  4. LightBus新浪微博客户端开源下载
  5. 经典JavaScript正则表达式实战
  6. java 并发实例_java一些常用并发工具示例
  7. 前端跨域请求get_HTTP--跨域真的有这么难吗
  8. 使用 qrcodejs 生成二维码的几个问题
  9. JAVA学习笔记(2)—— java初始化三个原则
  10. 让你上瘾的网易云音乐推荐算法,用Word2vec就可以实现