![](https://img-blog.csdnimg.cn/20190918140129601.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
面试_数据结构/算法
常见面试算法
-Sloth-
脚踏实地 仰望星空
展开
-
数组中的第K个最大元素
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4说明:你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。有两种解决思路,一种是最小堆,一种是快排最小堆它是一颗完全二叉树,它可以是空 树中结点的值总是不大于或者不小于其孩子结点的值 每一.转载 2020-12-24 17:46:30 · 208 阅读 · 1 评论 -
求两个数的最大公约数
这个问题首先考察的是数学功底,就是看知不知道一些求公约数的算法,比如辗转相除法、更相减损法等;其次就是考察你的代码能力了,看你能不能把算法用代码写出来,写的代码有没有bug,注没注意边界的处理等等。下面我们分别来看一下,不同的候选人会有什么样的表现。第一种,数学功底不扎实的,不知道目前已有的求公约数的方法,那估计只能写出下面这种代码了。//暴力求解privatestaticintgetCommonDivisor(intm,intn){//非法参数的处理...转载 2020-12-13 15:03:26 · 239 阅读 · 0 评论 -
给定一个数组求和
给定一个整数数组 nums和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。方法一:暴力法暴力法很简单,遍历每个元素 xx,并查找是否存在一个值与 target - xtarget−x 相等的目标元素。class Solution { public int[] twoSum(int[] nums, int target) { for (int i =...转载 2020-09-13 22:37:27 · 1227 阅读 · 0 评论 -
剑指Offer(四):从尾到头打印单链表
题目描述:实现一个函数,输入一个单链表的头结点,从尾到头反过来打印出每个结点的值思路1:将链表中的指针反转,改变链表的方向,然后再从头打印出来。思路2:遍历链表时是从头到尾,而打印链表时却是从尾到头,典型的“先进后出”——栈的特点,用栈来实现。每遍历一个节点,把该节点放到一个栈中,当遍历完整个链表后,再从栈顶开始逐个输出节点的值,此时输出的节点顺序已经反转过来了。思路3:栈可以实现,而递归本质上也是一个栈结构,从而可以用递归来实现。即:没遍历到一个节点时,先递归输出其后面的一个节点的值,再输原创 2020-09-06 15:17:16 · 211 阅读 · 0 评论 -
剑指Offer(三):合并两个有序数组
题目:两个排序的数组A1和A2,内存在A1的末尾有足够多的空余空间容纳A2,编写一个函数,将A2合并到A1并排序。首先想到的是从A1从头到尾复制数字,但是会出现多次复制一个数字的情况。比较好的方法是从尾到头比较A1和A2的数字,并把较大的数字,复制到A1中的合适位置。class solution{ public static void merge(int[] A1, int[] A2, int lengthA1, int lengthA2){ int indexA1 = l原创 2020-09-06 13:48:27 · 182 阅读 · 0 评论 -
剑指Offer(二):替换空格
题目请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。思路:最简单的方法就是从头到尾遍历,但是时间复杂度为O(n^2)。本文采用一种时间复杂度为O(n)的方法。我们可以先遍历一次字符串,这样就可以统计出字符串空格的总数,并可以由此计算出替换之后的字符串的总长度。每替换一个空格,长度增加2,因此替换以后字符串的长度等于原来的长度加上2乘以空格数目。以"We are happy"为例,"W原创 2020-08-23 22:05:26 · 66 阅读 · 0 评论 -
简单的面试算法题目
1、编程,用尽可能完整的java语言写一个类,把String作如下转化hello this is a computer-->computer a is this hellopublic static String swapWord(String s) { StringBuffer sb = new StringBuffer(); Str原创 2016-10-20 21:11:33 · 1478 阅读 · 0 评论 -
基础排序算法
本文就是介绍一些常见的排序算法。排序是一个非常常见的应用场景,很多时候,我们需要根据自己需要排序的数据类型,来自定义排序算法,但是,在这里,我们只介绍这些基础排序算法,包括:插入排序、选择排序、冒泡排序、快速排序(重点)、堆排序、归并排序等等。看下图:给定数组:int data[] = {9,2,7,19,100,97,63,208,55,78}一、直接插入排序(内部排转载 2016-10-14 14:43:42 · 762 阅读 · 0 评论 -
数组排序-快速排序
public class QuickSort { public static void main(String[] args) { int a[] = { 3, 6, 1, 8, 0, 5 }; quick(a); for (int i = 0; i < a.length; i++) System.out.print(a[i] + " "); } public stati原创 2016-08-08 20:47:44 · 345 阅读 · 0 评论 -
二分查找
二分查找是在已经排序完成的基础上进行的,每次选择数组中间的元素进行比较,如果比较的元素小于中间的元素,则将比较的元素对应的索引值赋值给末尾元素对应的索引。如果大于中间的元素,则将比较的元素对应的索引值赋值给开始元素对应的索引。图解:代码:public class BinarySearch { static int a[] = { 0, 1, 2, 3, 4, 7,9原创 2016-07-26 21:20:06 · 234 阅读 · 0 评论 -
数组排序-插入排序
插入排序在外层循环中控制循环次数,里层每次循环将外层循环对应的前面的元素进行排序。图解:代码实现:public class InsertSort { public static void main(String[] args) { int a[] = { 2, 4, 7, 1, 6, 3 }; for (int i = 1; i < a.length; i++) {原创 2016-07-26 21:09:38 · 301 阅读 · 0 评论 -
数组排序-选择排序
选择排序每次将首个数与后面的数字依次比较,每次找到最大(或最小)值。图解如下:具体代码:public class SelectSort { public static void main(String[] args) { long startTime = System.currentTimeMillis(); int[] a = { 2, 11, 5, 4, 7, 8原创 2016-07-26 21:05:10 · 367 阅读 · 0 评论 -
数组排序-冒泡排序
冒泡排序外层循环控制循环的次数,里层的循环对值进行判断,外层每次循环,找出最大(或最小)值。具体过程:代码实现过程:public class Bubble { static int s; public static void main(String[] args) { long startTime = System.currentTimeMillis(); in原创 2016-07-26 21:00:39 · 349 阅读 · 0 评论 -
剑指Offer(一):链表反转
例如:1->2->3->4->5->null反转之后:5->4->3->2->1->null链表通常会有一个头结点和一个尾节点,头结点没有存储值,只是起到指向下一个的作用,尾节点有数值,但是指向的下一个尾NULL,但是应该如何构建一个标准的链表呢?定义一个结构体:struct ListNode{ int val; struct ListNode* next;};创建链表:ListNode *L; //L..原创 2020-08-16 13:56:35 · 129 阅读 · 0 评论