算法
爱技术的小小林
这个作者很懒,什么都没留下…
展开
-
TOP K算法 统计英文电子书中出现次数最多的k个单词
统计一个大文件里出现次数top k的单词具体实现步骤:1、遍历文本,统计不同单词出现的次数(这里要注意判别是否是单词)。2、对map的value进行降序排列(这里运用了java中collections.sort()方法来排序),列出前十个单词。import java.util.*;import java.util.Map.Entry;import java.io.*;import junit.framework.TestCase; public class search { pu原创 2020-09-06 16:59:20 · 463 阅读 · 0 评论 -
字节跳动
链表翻转、插入、删除反转class Solution { public ListNode reverseList(ListNode head) { if(head==null||head.next==null){ return head; } ListNode cur=head; ListNode reversehead=null; ListNode temp=null;转载 2020-09-03 00:06:30 · 524 阅读 · 0 评论 -
奇安信笔试8.1-8.15-9.2
老板发钱老板共有n元,每次发奖金可以发1元,2元,3元,请问发n元一共有多少种发的方法?import java.util.Scanner;public class qianxin { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n=in.nextInt(); int []dp=new int[n+1]; if(原创 2020-08-31 19:53:00 · 1125 阅读 · 0 评论 -
科大讯飞
1.礼物价值的最大化/** * @Author Baker.chen * @create 2020/8/29 20:31 * * 礼物价值最大化 * 思路:创建一个二维数组dp[][],dp[i][j]代表的是从二维数组的左上角元素走到dp[i][j]这个单元格的最大价值 * 状态转移方程为:dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]) + dp[i][j] */public class Main { public static原创 2020-08-30 21:49:22 · 301 阅读 · 0 评论 -
猜数游戏
题目牛牛和羊羊在玩一个有趣的猜数游戏。在这个游戏中,牛牛玩家选择一个正整数,羊羊根据已给的提示猜这个数字。第i个提示是"Y"或者"N",表示牛牛选择的数是否是i的倍数。例如,如果提示是"YYNYY",它表示这个数使1,2,4,5的倍数,但不是3的倍数。注意到一些提示会出现错误。例如: 提示"NYYY"是错误的,因为所有的整数都是1的倍数,所以起始元素肯定不会是"N"。此外,例如"YNNY"的提示也是错误的,因为结果不可能是4的倍数但不是2的倍数。现在给出一个整数n,表示已给的提示的长度。请计算出长度转载 2020-08-24 16:35:06 · 323 阅读 · 0 评论 -
华为机试108题
统计大写字母个数找出给定字符串中大写字符(即’A’-‘Z’)的个数接口说明原型:int CalcCapital(String str);返回值:int输入:add123#$%#%#O输出:1import java.util.Scanner;import java.util.Set;import java.util.HashSet;public class Main{ public static void main(String [] args){ S原创 2020-08-09 23:50:33 · 543 阅读 · 0 评论 -
华为2016软件研发笔试题
1删数有一个数组a[N]顺序存放0~N-1,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。以8个数(N=7)为例:{0,1,2,3,4,5,6,7},0->1->2(删除)->3->4->5(删除)->6->7->0(删除),如此循环直到最后一个数被删除。输入描述:每组数据为一行一个整数n(小于等于1000),为数组成员数,如果大于1000,则对a[999]进行计算。输入:8输出:6import jav原创 2020-08-08 22:23:57 · 228 阅读 · 0 评论 -
华为2017软件研发编程笔试题
1有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?思路:递归问题3个瓶子换1瓶水+1个空瓶子,两个瓶子换1瓶水+0个空瓶子,1个瓶子换0瓶水。f(1) = 0f(2)原创 2020-08-08 20:20:17 · 393 阅读 · 0 评论 -
2021秋招华为软件开发笔试
题目:学校有一个在线学习系统,没门课程由N个页面组成(0< N<= 10000)个页面组成,学生从第一页开始按顺序学到最后一页提交学习记录。系统会记录每页停留的时间(单位秒),当学生提交时会分析时间是否满足要求,分析规则如下:每分钟(60秒)之内学完的页面不能大于4页。例如系统记录到某学生页面停留时间如下:10 120 10 20 10 10 50该学生第一分钟学完1页,第二分钟学完0页,第三分钟学完5页,第四分钟学完1页,则判定为不满足要求。输入描述:输入数据包含多个学生的提交原创 2020-08-08 11:38:09 · 1218 阅读 · 0 评论 -
【Leetcode刷题】【动态规划】
动态规划在此之前,先复习一下递归和分治,直接看代码模板:递归:分治:而动态规划实际上就是分治加上最优子结构,动态规划和递归与分治没有根本上的区别(关键是看有无最优子结构),下面结合一个例子来理解:62不同路径我们可以看一下这个问题,需要找到从左上角到右下角有多少种可能路径,首先看一下能否找出最优子结构,到图中(i,j)这个点有多少种走法,实际上相当于start到左边点的走法加上start到上边点的走法,所以可以写出状态转移方程:dp[i,j]=dp[i-1,j]+dp[i,j-1](原创 2020-07-06 17:13:07 · 151 阅读 · 0 评论 -
【Leetcode刷题】【二分查找】【69/33/153/154/852/367/35/162/744/704/剑53/287/74】x的平方根,搜索旋转排序数组,寻找排序数组中最小值,有效完全平方数
文章目录69 x的平方根题目描述69 x的平方根题目描述原创 2020-07-04 14:41:36 · 225 阅读 · 0 评论 -
【Leetcode刷题】【45/55/860/455/122/134/392/1221】跳跃游戏,柠檬水找零,分发饼干,买卖股票的最佳时机,加油站
文章目录跳跃游戏II题目描述跳跃游戏I题目描述860柠檬水找零题目描述455分发饼干题目描述122买卖股票的最佳时机题目描述134加油站题目描述392判断子序列题目描述1221分割平衡字符串题目描述跳跃游戏II题目描述首先我们来审题,这里是要找出到达最后一个位置需要跳跃多少次,而每次跳跃的步数要在该位置的值之内,注意,比如第0号位置值为2,则可以跳1补,也可以跳两步,主要是要找到最少次数跳到最后一个位置如下图,开始的位置是 2,可跳的范围是橙色的。然后因为 3 可以跳的更远,所以跳到 3 的位置。原创 2020-07-02 20:57:07 · 186 阅读 · 0 评论 -
【Leetcode刷题】【114/200/695/1254】二叉树展开为链表,岛屿问题,岛屿的最大面积,岛屿周长
文章目录114二叉树展开为链表题目描述200岛屿问题题目描述695岛屿的最大面积题目描述1254封闭岛屿的数目题目描述思路114二叉树展开为链表题目描述这个题目乍一看,根据前面的思路,你可以能首先会选择前序遍历的方式来解决,是可以的,但是,比较麻烦,因为前序遍历的方式会改变右节点的指向,导致比较麻烦,那么,如果前序遍历不行,就考虑中序和后序遍历了,由于,在展开的时候,只需要去改变左右节点的指向,所以,这里其实最好的方式还是用后续遍历,既然是后续遍历,那么我们就可以快速的把后续遍历的框架写出来了。p原创 2020-07-01 23:17:06 · 331 阅读 · 0 评论 -
【Leetcode刷题】【50/17/77/90】求x的n次方,电话号码的字母组合,组合
50求x的n次方题目描述思路分治法:1.写出递归终止条件2.当前层的处理3.下探到下一层,4.合并,class Solution { public double myPow(double x, int n) { long N=n; if(N<0){//n小于0则变换变为正数 x=1/x; N=-N; } return pow(x,N);原创 2020-06-29 20:25:50 · 193 阅读 · 0 评论 -
【Leetcode刷题】【46/47/51/52】全排列,N皇后
46全排列回溯算法框架result = []def backtrack(路径, 选择列表): if 满足结束条件: result.add(路径) return for 选择 in 选择列表: 做选择 backtrack(路径, 选择列表) 撤销选择我们在高中的时候就做过排列组合的数学题,我们也知道 n 个不重复的数,全排列共有 n! 个。PS:为了简单清晰起见,我们这次讨论的全排列问题不转载 2020-06-29 16:19:54 · 184 阅读 · 0 评论 -
【Leetcode刷题】【22/98/226/111/236/105/106】括号生成,验证二叉搜索树,翻转二叉树,二叉树的最小深度,最近公共祖先
22括号生成解题思路:2n个格子,每个格子可以存放两种,限制条件:1.左括号必须在第一个位置,并且左扩号的个数不大于n2.右括号的个数不大于左括号的个数3.插入左括号的代码要在右括号之上4.当左括号个数与右括号个数都等于n时,往结果集里加入字符串,class Solution { private List<String> list; public List<String> generateParenthesis(int n) { list原创 2020-06-28 16:10:50 · 172 阅读 · 0 评论 -
【Leetcode刷题】【94/144/590/589/429/102/145/559/107/104】二叉树的中序/前序/后序,N叉树的中序,后序,最大深度
94二叉树的中序遍历思路:树有左孩子,右孩子,可以看做是一个链表,中序遍历则是:从左子树,再到根节点,再到右子树,所以我们可以调用递归,来实现树的遍历。class Solution { public List<Integer> inorderTraversal(TreeNode root) { List<Integer> list=new ArrayList<>(); helper(root,list); retur原创 2020-06-27 17:15:55 · 132 阅读 · 0 评论 -
【Leetcode刷题】【242】有效的字母异位词【49】字母异位分组【219】存在重复元素II
题目描述给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。思路1.hashmap我们可以用两个hashmap,分别存储两个字符串对应的字母和出现次数,然后比较两个map是否一样,用equals,一样说明是异位的。```javaclass Solution {public boolean isAnagram(String s, String t) { if (s.length()!=t.length()) {//字符串长度不相等,直接返回 retu原创 2020-06-26 21:02:29 · 95 阅读 · 0 评论 -
【Leetcode刷题】【239】滑动窗口最大值
题目描述给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。思路暴力法滑动窗口,输入一个数组和一个窗口大小,那么输出的数组大小可以知道为nums.length-k+1,所以可以两重循环,外层循环遍历nums,内层遍历窗口,求出窗口最大值,此法时间复杂度较高。class Solution { public int[] maxSlidingWindow(int[]原创 2020-06-26 17:51:56 · 289 阅读 · 0 评论 -
【Leetcode刷题】【581】最短无连续子数组
题目描述给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。你找到的子数组应是最短的,请输出它的长度。示例:输入: [2, 6, 4, 8, 10, 9, 15]输出: 5解释: 你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。思路这个方法背后的想法仍然是选择排序。我们需要找到无序子数组中最小元素和最大元素分别对应的正确位置,来求得我们想要的无序子数组的边界。为了达到这一目的,此方法中,我们使用转载 2020-06-26 15:32:25 · 114 阅读 · 0 评论 -
【Leetcode刷题】【496】下一个更大元素
题目描述给定两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。示例:输入: nums1 = [4,1,2], nums2 = [1,3,4,2].输出: [-1,3,-1]解释:对于num1中的数字4,你无法在第二个数组中找到下一个更大的数字原创 2020-06-26 14:43:29 · 255 阅读 · 0 评论 -
【Leetcode刷题】【84】柱状图中最大的矩形
题目描述给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。思路1.暴力法:我们需要找到最大的面积,我们可以枚举宽,使用两重循环控制矩形的宽度,然后在宽度内找最小高度,再相乘就是矩形面积,然后不断更新矩形的面积,直到遍历完所有左边界。暴力法的时间复杂度高,一般不提倡使用。class Solution { public int largestRectangleArea(int[] heights) { int n = heights.l转载 2020-06-26 13:54:36 · 209 阅读 · 0 评论 -
【Leetcode刷题】【155】最小栈
题目描述设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。标题借用一个辅助栈min_stack,用于存获取stack中最小值。算法流程:1.push()方法: 每当push()新值进来时,如果 小于等于 min_stack栈顶值,则一起push()到min_stack,即更新了栈顶最小值;2.pop转载 2020-06-25 16:56:50 · 179 阅读 · 1 评论 -
【玩转数据结构 从入门到进阶2学习笔记】栈和队列
栈可以先来看看栈的应用,上图是程序调用的系统栈,箭头方向指明了程序运行顺序,我们运行到A2时把它压入栈,接着跳到B,执行到B2时再把它压入栈,再执行C,执行完C,我们可以看栈顶,是B2,我们跳回B2继续执行,B执行完后再看栈顶,是A2,跳回A2继续执行,A执行完后,栈空,程序结束,从这可以看出栈在程序调用问题上给出了很好的解决方法。栈的基本实现我们要如何实现一个栈呢,其实很简单,只要实现以下几个方法栈有推入,拿出操作,peek操作是查询并获取栈顶元素,还有获取栈内元素个数和判断是否为空,所以我原创 2020-05-15 16:52:45 · 127 阅读 · 0 评论 -
【Leetcode刷题】【70】【11】盛最多水的容器,爬楼梯
盛最多水的容器题目描述给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器,且 n 的值至少为 2思路双指针法:分别设置指针i,j在容器壁的两端,然后开始找小的那跟柱子,若是左边的i小,则取柱子高度计算容器体积,同时往右边移一位,右边同理,直到i与j相遇,结束循环返回最终结果。cl原创 2020-06-25 12:08:27 · 115 阅读 · 0 评论 -
【Leetcode刷题】【141】环形链表
题目描述给定一个链表,判断链表中是否有环。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。思路要判断链表中是否有环,可以使用双指针法,不过这里的双指针是一个快,一个慢,快指针一次走两步,慢指针一次一步,然后看快指针是否会与慢指针相等,若相等表明链表中有环产生,循环到快指针所指的为空或下一个位置为空,则表明没有环。public class Solution { public boolean h原创 2020-06-24 23:39:37 · 99 阅读 · 0 评论 -
【Leetcode 刷题】【206】反转链表
题目描述反转一个单链表示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL思路我们这里还是用到大名鼎鼎的双指针,我们可以申请一个指针cur和一个指针reversehead,最初reverhead指向null,cur指向头结点,还有一个指针temp,指向cur的下一个结点;然后我们开始反转过程: temp=cur.next; cur.next=rev原创 2020-06-24 23:19:39 · 98 阅读 · 0 评论 -
【Leetcode刷题】【15】三数之和
题目描述给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:[[-1, 0, 1],[-1, -1, 2]]暴力法输入的数组元素过多时,处理的时间会很长,超出时间限制,不推荐private List<List<Integer>>转载 2020-06-24 17:08:29 · 221 阅读 · 1 评论 -
【Leetcode刷题】【283】移动零
题目描述给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]思路:双指针法,i每移动一次,寻找非零的元素,找到后替换nums[j]的值,j再往后移动,j指针主要用来填充非零元素,直到所有的i遍历完,结束。class Solution { public void moveZeroes(int[] nums) { int j=0; for原创 2020-06-24 11:40:59 · 91 阅读 · 0 评论 -
七大基本排序算法图文详解
文章目录冒泡排序算法描述选择排序算法描述插入排序算法描述希尔排序算法描述快速排序算法描述归并排序算法描述基数排序(桶排序算法描述思路冒泡排序算法描述1.i从0开始,i与i+1比较,如果i>i+1,那么就互换。2.i不断增加,直到最后一个元素,一趟比较下来,最大的元素就放到了数组最后。3.接着开始第二趟,第二趟完后倒数第二位也是第二大的数。4.以此类推,5个数的数组就需要4趟比较,然后第⼀趟需要⽐较4次,第⼆趟需要⽐较3次,第三趟需要⽐较2次,第四躺需要⽐较1次。5.我们在比较过程中可能第原创 2020-06-22 18:56:36 · 490 阅读 · 1 评论 -
【玩转数据结构 从入门到进阶13学习总结】红黑树与AVL树的区别
比较红黑树不追求"完全平衡",即不像AVL那样要求节点的左右孩子高度差不超过1,它只要求部分达到平衡,就是要求从根节点到叶子节点的最长路径不大于最短路径的两倍。红黑是用非严格的平衡来换取增删节点时候旋转次数的降低,任何不平衡都会在三次旋转之内解决,而AVL是严格平衡树,因此在增加或者删除节点的时候,根据不同情况,旋转的次数比红黑树要多就插入节点导致树失衡的情况,AVL和RB-Tree都是最多两次树旋转来实现复衡rebalance,旋转的量级是O(1)但在删除节点时导致的失衡,AVL需要维护从被删除节原创 2020-05-24 16:49:14 · 166 阅读 · 0 评论 -
【玩转数据结构 从入门到进阶10学习笔记】并查集
并查集Quick Union这个版本的目的是使用一个数组构建一棵指向父节点的树,首先是将每个元素看做是一个节点,让每个节点指向自己,接下来做union操作这个操作是将3所在集合的根节点指向8所在集合的根节点public class UnionFind2 implements UF { // 我们的第二版Union-Find, 使用一个数组构建一棵指向父节点的树 // parent[i]表示第一个元素所指向的父节点 private int[] parent;原创 2020-05-23 21:12:57 · 147 阅读 · 0 评论 -
【玩转数据结构 从入门到进阶11学习笔记】AVL
平衡二叉树平衡二叉搜索树又被称为AVL树,且具有性质:对于任意一个节点,其左子树和右子树的高度差不能超过1.。节点高度我们要维持树的自平衡结构,就要计算平衡因子,根据平衡因子予以调整,而计算平衡因子就需要标注节点的高度,叶子节点对应的高度为1,对于有左子树和右子树的节点,对应的高度为左右子树中最高的子树高度加一,所以标注节点可以这样写: // 获得节点node的高度 private int getHeight(Node node){ if(node == null)原创 2020-05-23 20:07:25 · 203 阅读 · 0 评论 -
【玩转数据结构 从入门到进阶12学习笔记】红黑树
2-3树二叉查找树中树高会受到输入数据的影响,极端情况下一棵树和一个链表没什么区别,所以我们需要一种树,它的所有叶节点到根节点的距离都是相等的,这种树为平衡树,并且随着数据的加入,这种平衡性会一直保持,它就是2-3查找树,它是一棵绝对平衡的树。如上图,存放一个元素的为2节点,存放两个元素的为3节点,对于2节点,它与二叉查找树特性相同,左链接比节点值小,右链接比节点值大,而对于3节点,它有三个链接,左链接指向的左子树所有元素都小于3节点的两个键,中间链接指向的子树元素大小介于两个键中间,右链接指向的子树原创 2020-05-23 17:50:50 · 201 阅读 · 0 评论 -
【leetcode Day4】【211】【677】字典树
【211】添加与搜索单词–数据结构设计设计一个支持以下两种操作的数据结构:void addWord(word)bool search(word)search(word) 可以搜索文字或正则表达式字符串,字符串只包含字母 . 或 a-z 。 . 可以表示任何一个字母。示例:addWord(“bad”)addWord(“dad”)addWord(“mad”)search(“pad”) -> falsesearch(“bad”) -> truesearch(".ad") ->原创 2020-05-21 16:16:52 · 121 阅读 · 0 评论 -
【玩转数据结构 从入门到进阶9学习笔记】字典树Trie
什么是Trie上图便是一棵字典树,它是一棵多叉树,它通常只用来处理字符串,当数据为单词的时候,把单词以字母为单位一个一个拆开,从根节点开始,一直到叶子节点去遍历,每遍历到一个叶子节点形成一个单词。所以它的时间复杂度为O(w),w为字符串的长度。字典树还有一个问题,就是当一个单词的前缀也为一个单词,如pan为平底锅,是panda的前缀,该如何表示,我们就需要一个标识符,去标识该节点是一个单词的结尾,我们还用到了映射,一个字符对应一个节点,这两部分构成了字典树的基本节点类字典树基础public cla原创 2020-05-21 15:47:51 · 157 阅读 · 0 评论 -
【leetcode day3】【804】【349】【350】集合与映射
【804】唯一摩尔斯密码词public int uniqueMorseRepresentations(String[] words) { /* 将26个英文字母对应的摩斯字符存到一个数组里 然后将输入字符串遍历for-each循环 将每个单词每个字符读取,转换成摩斯密码,存到字符串中,再将字符串存到TreeSet里,集合会自动去重,所以最后返回集合的大小,就可以获得所有词不同单词翻译的数量 */ Strin原创 2020-05-19 23:05:40 · 156 阅读 · 0 评论 -
单链表操作(Java实现)
单链表用一组地址任意的存储单元存放线性表中的数据元素。数据域 (数据元素)+ 指针域 (指示后继元素存储位置)= 结点单链表创建与输出package danlianbiao;public class LinkList {public Node head;//头结点public Node current;//当前结点//方法:向链表中添加数据public void add(int data) { //判断链表为空的时候 if (head == null) {//如果头结点为空,说原创 2020-05-12 22:03:23 · 242 阅读 · 0 评论 -
【数据结构基础】哈希查找
哈希表定义:根据设定的哈希函数 H(key) 和提供的处理冲突的方法,将一组关键字映象到一个地址连续的地址空间上,并以关键字在地址空间中的“象”作为相应记录在表中的存储位置,如此构造所得的查找表称之为哈希表。散列存储的基本思路:以数据中每一个元素的keywordK为自变量。通过散列函数H(k)计算出函数值,以该函数值作为一块连续存储空间的的单元地址,将该元素存储到函数值相应的单元中。时间复杂度:哈希表存储的是键值对,其查找的时间复杂度与元素数量多少无关。哈希表在查找元素时是通过计算哈希码值来定位原创 2020-05-12 12:11:34 · 1153 阅读 · 0 评论