程序员面试金典(一)

2023-12-08 04:32
文章标签 面试 程序员 金典

本文主要是介绍程序员面试金典(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.算法题的五种解法

方法一:举例法

举例法简单来讲就是数学中的归纳推理和演绎推理,根据特征找到通解,最常见的是在数列运算过程中,大家熟知的斐波那契数列,1+....+100,等等,都可以使用举例法解答。

方法二:模式匹配法

模式匹配法是指将现有问题与相似问题作类比,看看能否通过修改相关问题的解法来解决新问题。

方法三:简化推广法

采用简化推广法,具体做法对于问题可以分步进行处理。首先,我们会修改某个约束条件,比如数据类型或数据量,从而简化这个问题。接着,转而处理这个问题的简化版本。最后,一旦找到解决简化版问题的算法,我们就可以基于这个问题进行推广,并调整最终的解决方案,找到最优解。

方法四:简单构造法

对于某些问题,简单构造法非常高效。使用简单构造法,我们会从最基本的情况(比如n=1)来解决问题,还是拿斐波那契数列来举例子,最后可以发现,这是一个递归方法可以解决的问题。所以,简单构造法最后往往会演变成递归法。

方法五:数据结构头脑风暴法

数据结构头脑风暴法过程往往会相对来说较复杂。运用数据结构中的链表,数组,二叉树,堆来解决问题,根据具体情况选择最优解。

2.数组与字符串

2.1散列表

散列表是一种将键(key)映射为值(value)从而实现快速查找的数据结构。散列表包含一个底层数组和一个散列函数(hash function)。插入一个对象及对应的键时,散列函数会将键映射为数组的一个索引。这个对象就回储存到数组中该索引的位置。

public HashMap<Integer, Student> buildMap(Student[] students){HashMap<Integer, Student> map = new HashMap<>();for (student s : students) {map.put(s.getId(),s);}return map;}

2.2 ArrayList(动态数组)

ArrayList,即动态数组,是一种按需调整大小的数组,数据访问时间为O(1)。一种典型的实现是在数组存满时扩容,每次扩容时O(n),均摊下来还是O(1)。

public ArrayList<String> merges(String[] words,String[] more){ArrayList<String> sentence = new ArrayList<>();for (String w : words) {sentence.add(w);}for (String m : more) {sentence.add(m);}return sentence;
}

2.3 StringBuffer

在Java编程中把一组字符串拼接起来,可以使用String str = "hello" + "字符";但是这样操作相当于每次都创建一个string对象的字符串,运行效率低下而且还特别占用内存,为了简化这种状况可以使用StringBuffer

public String mergeStr(String[] string){StringBuffer sb = new StringBuffer();for (String str : string) {sb.append(str);}return sb.toString();
}

3.链表

链表问题往往涉及递归操作,非常依赖概念。

3.1创建链表

以下代码为创建一个基本的单向链表。

class Node{Node next = null;int data;public Node(int d){data = d;}void appendToTail(int d){Node end = new Node(d);Node n = this;while(n.next != null){n = n.next;}n.next = end;}
}

3.2删除单向链表中的节点

删除单向链表,给定一个节点n,我们先找到它的前趋节点prev,并将prev.next设置为n.next。如果是双向链表,还要更新n.next,将n.next.prev置为n.prev.

  • 注意:(1)检查空指针;(2)必要时更新表头(head)或表尾(tail)指针。
    Node deleteNode(Node head,int d){Node n = head;if (n.data == d) {return head.next;//表头指向下一个节点}while(n.next ! = null){if (n.next.data == d) {n.next = n.next.next;return head; //表头不变}n = n.next;}return head;}

3.3“快行指针”技巧

在处理链表问题时,“快行指针”(runner,或者称为第二个指针)是一种很常见的技巧,“快行指针”指的是同时用两个指针来迭代访问链表,只不过其中一个比另一个超前一些。“快”指针往往先行几步,或与“慢”指针相差固定的步数。

3.4递归问题

许多链表问题都要用到递归。当然,还需注意递归算法至少要占用O(n)空间,其中n为递归调用层数。

4.栈和队列

4.1实现一个栈

栈采用后进先出(LIFO)顺序。实际上,栈和链表本质上是一样的,用户只能看到栈顶元素。

class Stacks{Node top;Object pop(){if (top != null) {Object item = top.data;top = top.next;return item;}return null;}void push(Object item){Node t = new Node(item);t.next = top;top = t;}Object peek(){return top.data;}
}

以下是一个具体栈的实例:

public class Stacks {static String[] months = {"Jan","Feb","Mar","Apr","May","June","Aug","Sep","Oct","Nov","Dec"};public static void main(String[] args) {Stack stack = new Stack();//进栈,先进元素压入栈底,最后的元素在栈顶for (int i = 0; i < months.length; i++) {stack.push(months[i]+"");}System.out.println("stk = " + stack);stack.addElement("************");System.out.println("element 5 = " + stack.elementAt(5));System.out.println("popping elements: ");//出栈后进先出,栈顶元素最先被输出while (!stack.empty()) {System.out.println(stack.pop());}}
}

4.2实现一个队列

队列采用先进先出(FIFO)顺序。队列也可以用链表实现,新增元素追加至表尾。

class Queue{Node first,last;void enqueue(Object item){if (first == null) {last = new Node(item);first = last;}else{last.next = new Node(item);last = last.next;}}Object dequeue(){if (first != null) {Object item = first.data;first = first.next;return item;}}
}

5.树和图

5.1需要注意的潜在问题

  • 二叉树与二叉查找树
    二叉查找树一般会有附加条件:对于任意节点,左子节点小于或等于当前节点,后者又小于所有右子节点。
  • 平衡与不平衡
    树的平衡有多重方法,平衡一棵树只意味着子树的深度差不会超过一定值,并不表示左子树和右子树的深度完全相同。
  • 完满和完整(Full and Complete)
    完满和完整树的所有叶节点都在树的底部,所有非叶节点都有两个子节点。完满和完整树必须满足 2n1 个节点。

5.2二叉树遍历

二叉树遍历一般分为中序、后序和前序遍历。

5.3树的平衡:红黑树和平衡二叉树

5.4单词查找树(trie)

trie树是n层树的一种变体,其中每个节点存储有字符。整棵树的每条路径自上而下表示一个单词。

5.5图的遍历

  • 深度优先搜索(DFS)
    在DFS中,先访问节点r,然后循环访问r的每个相邻节点。在访问r的相邻节点n时,会在访问r的其他相邻节点之前先访问n的所有相邻节点。前序和树遍历的其他形式都是一种DFS,区别是对图实现该算法时,必须先检查该节点是否已访问。否则,可能会死循环。
    实现DFS伪代码:
void search(Node root){if(root == null) return;visit(root);root.visited = true;foreach(Node n in root.adjacent){if(n.visited == false) search(n);}
}
  • 广度优先搜索(BFS)
    在搜索r的“孙子节点”之前先访问节点r的所有相邻节点。一般用队列实现的迭代方案最有效。
    实现BFS伪代码:
void search(Node root){Queue queue = new Queue();root.visited = true;visit(root);queue.enqueue(root);//加至队列尾部while(!queue.isEmpty()){Node r = queue.dequeue();//从队列头部移除foreach(Node n in r.adjacent){if(n.visited ==false){visit(n);n.visited = true;queue.enqueue(n);}}}
}

这篇关于程序员面试金典(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/468542

相关文章

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

java面试常见问题之Hibernate总结

1  Hibernate的检索方式 Ø  导航对象图检索(根据已经加载的对象,导航到其他对象。) Ø  OID检索(按照对象的OID来检索对象。) Ø  HQL检索(使用面向对象的HQL查询语言。) Ø  QBC检索(使用QBC(Qurey By Criteria)API来检索对象。 QBC/QBE离线/在线) Ø  本地SQL检索(使用本地数据库的SQL查询语句。) 包括Hibern

贝壳面试:什么是回表?什么是索引下推?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50+)中,最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的面试题: 1.谈谈你对MySQL 索引下推 的认识? 2.在MySQL中,索引下推 是如何实现的?请简述其工作原理。 3、说说什么是 回表,什么是 索引下推 ? 最近有小伙伴在面试 贝壳、soul,又遇到了相关的

毕业前第二次面试的感慨

距面试已经过去了有几天了,我现在想起来都有说多的恨感慨。 我一直都是想找刚刚起步的企业,因为这能让我学到更多的东西,然而正好有一家企业是刚起步的,而且他还有自己的产品专利,可以说这是一家,即是创业又是刚起步的公司,这家公司回复了我投给他的简历,这家企业想进一步了解我的情况,因为简历上我符合这家企业的基本要求,所以要进一步了解。 虽然面试的过程中,他给我的面试题,我做得并不是很理想,

LabVIEW程序员是怎样成长为大佬

成为一名LabVIEW编程领域的“大佬”需要时间、实践、学习和解决复杂问题的经验。尽管LabVIEW作为一种图形化编程语言在初期可能相对容易上手,但要真正成为精通者,需要在多个层面上深入理解。以下是LabVIEW程序员如何逐步成长为“大佬”的路径: 1. 打好基础 LabVIEW的大佬们通常在初期会打下非常坚实的基础,理解LabVIEW编程的核心概念,包括: 数据流编程模型:Lab

腾讯社招面试经历

前提:本人2011年毕业于一个普通本科,工作不到2年。   15号晚上7点多,正在炒菜做饭,腾讯忽然打电话来问我对他们的Linux C++的职位是否感兴趣,我表达了我感兴趣之后,就开始了一段简短的电话面试,电话面试主要内容:C++和TCP socket通信的一些基础知识。之后就问我一道算法题:10亿个整数,随机生成,可重复,求最大的前1万个。当时我一下子就蒙了,没反应过来,何况我还正在烧

完整的腾讯面试经过

从9月10号开始到现在快两个月了,两个多月中,我经历数次面试和笔试,在经历这些的同时积累了不少的经验,也学到了不少东西,在此把它记录下来,算是和一起找工作中的同学一起共勉吧。我是本校的学生,专业是机械制造及其自动化,找工作的主要目标是计算机软件类和机械制造方向的国内的企业,所以意向去外企的同学就不必浪费时间看这些面经啦,想去国内IT企业的同学可以继续看下去。本贴中我把最近的腾讯面试经过写下

仕考网:结构化面试流程介绍

(一)结构化面试 结构化面试,也叫做标准化面试,考官按照预先设定好的一套试题以问答方式与应试者当面交谈,根据应试者的言语、行为表现,对其相关能力和个性特征作出相应评价。 (二)考试流程 抵达考场——审核抽签——面试候考——进入考场——面试答题——考生退场——计分审核 (三)答题技巧 1.声音洪亮,音量可以比平时说话声音大一点。 2.语速不要过快,语速快容易卡顿,而且不便于考官听清答

嵌入式面试经典30问:二

1. 嵌入式系统中,如何选择合适的微控制器或微处理器? 在嵌入式系统中选择合适的微控制器(MCU)或微处理器(MPU)时,需要考虑多个因素以确保所选组件能够满足项目的具体需求。以下是一些关键步骤和考虑因素: 1.1 确定项目需求 性能要求:根据项目的复杂度、处理速度和数据吞吐量等要求,确定所需的处理器性能。功耗:评估系统的功耗需求,选择低功耗的MCU或MPU以延长电池寿命或减少能源消耗。成本