算法题详解
文章平均质量分 52
算法题的解析和代码
唯有一颗慎独心
渴望力量使我成为琦玉
展开
-
JAVA算法中各类数据结构的初始化及常用函数(自用)
java算法题中常见数据结构的初始化以及常用函数。原创 2021-12-30 14:31:40 · 1971 阅读 · 0 评论 -
探讨递归算法的时间复杂度
题目:求x的n次方解析过程:这种简单的题,我们拿到手就会做,立马写出:int function1(int x, int n) { int result = 1; for (int i = 0; i < n; i++) { result = result * x; } return result;}但是这种for循环的代码一看时间复杂度为O(n),那有没有效率更好的算法呢。想了一下,有,可以用递归啊,写出代码:int function原创 2021-05-18 11:26:15 · 681 阅读 · 1 评论 -
JAVA面试题最新大全(十五)
JVM176.说一下 jvm 的主要组成部分?及其作用?类加载器(ClassLoader)运行时数据区(Runtime Data Area)执行引擎(Execution Engine)本地库接口(Native Interface)组件的作用: 首先通过类加载器(ClassLoader)会把 Java 代码转换成字节码,运行时数据区(Runtime Data Area)再把字节码加载到内存中,而字节码文件只是 JVM 的一套指令集规范,并不能直接交个底层操作系统去执行,因此需要特定的命令解析器原创 2021-03-28 20:00:39 · 75 阅读 · 0 评论 -
JAVA面试题最新大全(十四)
Redis161.redis 是什么?都有哪些使用场景?Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。Redis 使用场景:数据高并发的读写海量数据的读写对扩展性要求高的数据162.redis 有哪些功能?数据缓存功能分布式锁的功能支持数据持久化支持事务支持消息队列163.redis 和 memecache 有什么区别?memcached所有的值均是简单的字原创 2021-03-28 19:35:47 · 80 阅读 · 0 评论 -
JAVA面试题最新大全(十三)
MySql146.数据库的三范式是什么?第一范式:强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项。第二范式:要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性。第三范式:任何非主属性不依赖于其它非主属性。147.一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?表类型如果是 MyISAM ,那 id 就是 8。表类型如果是 InnoDB,那 id 就是 6。InnoDB原创 2021-03-27 21:55:12 · 116 阅读 · 0 评论 -
JAVA面试题最新大全(十二)
Zookeeper139.zookeeper 是什么?zookeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 google chubby 的开源实现,是 hadoop 和 hbase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。140. zookeeper 都有哪些功能?集群管理:监控节点存活状态、运行请求等。主节点选举:主节点挂掉了之后可以从备用的节点开始新一轮选主,主节点选举说的就是这个选举的过程,使原创 2021-03-27 21:43:25 · 61 阅读 · 0 评论 -
JAVA面试题最新大全(十一)
Mybatis125. mybatis 中 #{}和 ${}的区别是什么?#{}是预编译处理,${}是字符串替换;Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;Mybatis在处理${}时,就是把${}替换成变量的值;使用#{}可以有效的防止SQL注入,提高系统安全性。126. mybatis 有几种分页方式?数组分页sql分页拦截器分页RowBounds分页128. mybatis 逻辑分页和物理分页的原创 2021-03-27 21:32:32 · 77 阅读 · 0 评论 -
JAVA面试题最新大全(十)
Hibernate113. 为什么要使用 hibernate?对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。114. 什么是 ORM 框架原创 2021-03-17 16:51:46 · 76 阅读 · 0 评论 -
JAVA面试题最新大全(九)
Spring Boot / Spring Cloud104. 什么是 spring boot?在Spring框架这个大家族中,产生了很多衍生框架,比如 Spring、SpringMvc框架等,Spring的核心内容在于控制反转(IOC)和依赖注入(DI),所谓控制反转并非是一种技术,而是一种思想,在操作方面是指在spring配置文件中创建,依赖注入即为由spring容器为应用程序的某个对象提供资源,比如 引用对象、常量数据等。SpringBoot是一个框架,一种全新的编程规范,他的产生简化了框架的使用原创 2021-03-17 16:37:18 · 103 阅读 · 0 评论 -
JAVA面试题最新大全(八)
设计模式88. 说一下你熟悉的设计模式?参考:设计模式大全89. 简单工厂和抽象工厂有什么区别?简单工厂模式:这个模式本身很简单而且使用在业务较简单的情况下。一般用于小项目或者具体产品很少扩展的情况(这样工厂类才不用经常更改)。它由三种角色组成:工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑,根据逻辑不同,产生具体的工厂产品。如例子中的Driver类。抽象产品角色:它一般是具体产品继承的父类或者实现的接口。由接口或者抽象类来实现。如例中的Car接口。具体产品角色:工原创 2021-03-17 15:49:46 · 220 阅读 · 0 评论 -
JAVA面试题最新大全(七)
网络79. http 响应码 301 和 302 代表的是什么?有什么区别?答:301,302 都是HTTP状态的编码,都代表着某个URL发生了转移。区别:301 redirect: 301 代表永久性转移(Permanently Moved)。302 redirect: 302 代表暂时性转移(Temporarily Moved )。80. forward 和 redirect 的区别?Forward和Redirect代表了两种请求转发方式:直接转发和间接转发。直接转发方式(F原创 2021-03-12 20:36:55 · 70 阅读 · 0 评论 -
JAVA面试题最新大全(六)
异常74. throw 和 throws 的区别?throws是用来声明一个方法可能抛出的所有异常信息,throws是将异常声明但是不处理,而是将异常往上传,谁调用我就交给谁处理。而throw则是指抛出的一个具体的异常类型。75. final、finally、finalize 有什么区别?final可以修饰类、变量、方法,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表示该变量是一个常量不能被重新赋值。finally一般作用在try-catch代码块中,在处理异常的时候,原创 2021-03-12 17:20:02 · 70 阅读 · 0 评论 -
JAVA面试题最新大全(五)
反射57. 什么是反射?反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力Java反射:在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法Java反射机制主要提供了以下功能:在运行时判断任意一个对象所属的类。在运行时构造任意一个类的对象。在运行时判断任意一个类所具有的成员变量和方法。在运行时调用任意一个对象的方法。58. 什么是 java 序列化?什么情况下需要序列化?简单说就是为了保存在内原创 2021-03-12 15:08:27 · 84 阅读 · 0 评论 -
JAVA面试题最新大全(四)
多线程35. 并行和并发有什么区别?并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。并行是在多台处理器上同时处理多个任务,并发是在一台处理器上“同时”处理多个任务。如hadoop分布式集群。36. 线程和进程的区别?简而言之,进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程。线程是进程的一个实体,是cpu调度和分派的基本单位,是比程序更小的能独立运行原创 2021-02-28 22:32:58 · 72 阅读 · 0 评论 -
JAVA面试题最新大全(三)
18. java 容器都有哪些?常用容器的图录:19.Collection 和 Collections 有什么区别?java.util.Collection是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List与Set。Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用原创 2021-02-28 16:48:56 · 174 阅读 · 0 评论 -
算法之爬梯子
题目:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。解析:我们用 f(x)f(x) 表示爬到第 xx 级台阶的方案数,考虑最后一步可能跨了一级台阶,也可能跨了两级台阶,所以我们可以列出如下式子:f(x)=f(x−1)+f(x−2)它意味着爬到第 xx 级台阶的方案数是爬到第 x - 1级台阶的方案数和爬到第 x - 2级台阶的方案数的和。很好理解,因为每次只能爬 1 级或 2 级,所以 f原创 2021-02-03 17:20:15 · 608 阅读 · 0 评论 -
JAVA面试题最新大全(二)
11. 抽象类必须要有抽象方法吗?不需要,抽象类不一定非要有抽象方法。 如下:abstract class Cat { public static void sayHi() { System.out.println("hi~"); }}上面代码,抽象类并没有抽象方法但完全可以正常运行。12. 普通类和抽象类有哪些区别?·普通类不能包含抽象方法,抽象类可以包含抽象方法。·抽象类不能直接实例化,普通类可以直接实例化。13. 抽象类能使用 final原创 2021-01-31 22:53:35 · 79 阅读 · 0 评论 -
算法之求x的平方根
题目:实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。解析:这题的解法用暴力解法是非常简单的。主要的麻烦在于如何解的更好,答案就是用牛顿迭代法。下面这种方法可以很有效地求出根号 a的近似值:首先随便猜一个近似值 x,然后不断令 x 等于 x 和 a/x的平均数,迭代个六七次后 x 的值就已经相当精确了。例如,我想求根号 2 等于多少。假如我猜测的结果为 4,虽然错的离谱,但你可以看到使用牛原创 2021-01-31 00:15:59 · 1258 阅读 · 0 评论 -
算法之二进制求和
题目:给你两个二进制字符串,返回它们的和(用二进制表示)。输入为 非空 字符串且只包含数字 1 和 0。解析:我们可以借鉴「列竖式」的方法,末尾对齐,逐位相加。在十进制的计算中「逢十进一」,二进制中我们需要「逢二进一」。具体的,我们可以取 n = max{ a.length, b.length },循环 n次,从最低位开始遍历。我们使用一个变量carry表示上一个位置的进位,初始值为 0。记当前位置对其的两个位为 ai和 bi ,则每一位的答案为 (carry+ ai + bi) %2,下一位的原创 2021-01-30 20:05:14 · 876 阅读 · 0 评论 -
算法之加一
题目:给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。解析:根据题意,加一 有可能的情况就只有两种:1.除9之外的数字加一;2.数字9。然后还有一些特殊情况就是当出现 99、999 之类的数字时,循环到最后也需要进位,出现这种情况时需要手动将它进一位。 public int[] plusOne(int[] digits) { int原创 2021-01-30 16:57:38 · 328 阅读 · 0 评论 -
算法之最后一个单词的长度
题目:给定一个仅包含大小写字母和空格 ’ ’ 的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。如果不存在最后一个单词,请返回 0 。说明:一个单词是指仅由字母组成、不包含任何空格字符的 最大子字符串解析:先去掉字符串两边的空格,再从后往前遍历,遍历到空格就停止遍历,返回单词长度。 public int lengthOfLastWord(String s) { s=s.trim(); int len=s.lengt原创 2021-01-30 14:14:53 · 80 阅读 · 0 评论 -
算法之最大子序和
题目:给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。解析:采用动态规划的思想。详细看注释。public int maxSubArray(int[] nums) { int n = nums.length; if(n == 0) return 0; //定义dp数组,dp数组中的每个值dp[i]代表着以nums[i]为结尾的最大子序和 int[] dp = new int[n]; //以nums[0]结尾的原创 2021-01-30 00:25:27 · 158 阅读 · 0 评论 -
算法之外观数列
题目:给定一个正整数 n ,输出外观数列的第 n 项。「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。你可以将其视作是由递归公式定义的数字字符串序列:前五项如下:111211211111221第一项是数字 1描述前一项,这个数是 1 即 “ 一 个 1 ”,记作 “11”描述前一项,这个数是 11 即 “ 二 个 1 ” ,记作 “21”描述前一项,这个数是 21 即 “ 一 个 2 + 一 个 1 ” ,记作 “1211”描述前一项,这个数是 1原创 2021-01-30 00:03:20 · 180 阅读 · 0 评论 -
算法之搜索插入位置
题目:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。解析:很简单哈,看代码就明白了。 public int searchInsert(int[] nums, int target) { if(target<nums[0]){ return 0; } for(int i=0;i<nums.length;i++){原创 2021-01-29 21:04:27 · 142 阅读 · 0 评论 -
算法之匹配字符串
题目:给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。解析:比较简单,直接字符串对比即可。 public int strStr(String haystack, String needle) { int len_h = haystack.length(); int len_n = needle.length(); for(i原创 2021-01-29 17:06:59 · 91 阅读 · 0 评论 -
算法之统计排序数组中的非重复项个数
题目:给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。解析:数组完成排序后,我们可以放置两个指针 i 和 j,其中 j是慢指针,而 i 是快指针。只要 nums[i] = nums[j],我们就增加i 以跳过重复项。实际上,不重复元素的新数组是根据指针 j 来记录的。j 记录了有多少个不重复的元素。 public int removeDupli原创 2021-01-29 12:59:18 · 517 阅读 · 0 评论 -
算法之合并两个有序链表
题目:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。解析:标签:链表、递归这道题可以使用递归实现,新链表也不需要构造新节点,我们下面列举递归三个要素终止条件:两条链表分别名为 l1 和 l2,当 l1 为空或 l2 为空时结束返回值:每一层调用都返回排序好的链表头本级递归内容:如果 l1 的 val 值更小,则将 l1.next 与排序好的链表头相接,l2 同理 public ListNode mergeTwoLists(ListNode原创 2021-01-28 21:48:26 · 230 阅读 · 0 评论 -
算法之有效的括号
题目:给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。解析:建立一个新的栈,然后遍历字符串的字符,进行比较 public boolean isValid(String s) { Stack<Character>stack = new Stack<Character>(); for(char c: s.to原创 2021-01-28 20:08:04 · 203 阅读 · 0 评论 -
算法之最长公共前缀
题目:编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。解析:一种方法是纵向扫描。纵向扫描时,从前往后遍历所有字符串的每一列,比较相同列上的字符是否相同,如果相同则继续对下一列进行比较,如果不相同则当前列不再属于公共前缀,当前列之前的部分为最长公共前缀。 public String longestCommonPrefix(String[] strs) { if(strs.length==0 || strs == null ){原创 2021-01-28 17:56:58 · 119 阅读 · 0 评论 -
算法之罗马数字转整数
题目:罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。原创 2021-01-28 15:19:23 · 205 阅读 · 0 评论 -
算法之回文数
题目:判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。简单去思考,就是转换为字符串去判断是否为回文数。 public boolean isPalindrome(int x) { StringBuffer sb1=new StringBuffer(x+""); StringBuffer sb2=new StringBuffer(x+""); sb1.reverse(); if(sb1.t原创 2021-01-28 11:02:43 · 534 阅读 · 0 评论 -
算法之整数反转
题目:给你一个 32 位的有符号整数 x ,返回 x 中每位上的数字反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。 public int reverse(int x) { StringBuffer sb = new StringBuffer(); int flag=1; if(x>0){ flag=1; }else {原创 2021-01-27 23:36:49 · 152 阅读 · 0 评论 -
算法之根据两数和求数组中两数的下标
题目:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。 public int[] twoSum(int[] nums, int target) { int[] aim=new int[2]; int sum=nums.length; for(int i=0;i<sum;++i ){ for(int j=i+1;j<sum;++j){原创 2021-01-27 22:17:39 · 170 阅读 · 0 评论 -
算法之求位1的个数
题目:编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量) public int hammingWeight(int n) { int mask=1; int sum=0; for(int i=0;i<32;++i){ if((n & mask) != 0){ sum++; }原创 2021-01-27 21:49:37 · 355 阅读 · 0 评论 -
算法之两整数之和
题目:不使用运算符 + 和 - ,计算两整数 a 、b 之和。既然不能使用运算符,那就联想到使用位运算符: public int getSum(int a, int b) { int sum=a^b; int temp= (a & b) <<1; if(temp!=0){ return getSum(sum,temp); } return sum;原创 2021-01-27 19:00:36 · 610 阅读 · 0 评论 -
算法之判断存在重复元素
题目:给定一个整数数组,判断是否存在重复元素。如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。看到题目立刻写答案: public boolean containsDuplicate(int[] nums) { int n=nums.length; for(int i=0;i<n;++i){ for(int j=i+1;j<n;++j){ if(n原创 2021-01-27 14:14:47 · 902 阅读 · 0 评论 -
算法之求质数
问题:统计所有小于非负整数 n 的质数的数量。一开始直接使用暴力枚举法:public static int countPrimes(int n) { for (int i = 2; i < n; i++) { boolean j = isPrimes(i); if (j) { // 不是质数 count++; } } return count; } public static boolean isPrimes(int n) { for (int i原创 2021-01-27 12:06:36 · 151 阅读 · 0 评论 -
JAVA面试题最新大全(一)
1. JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境。 JRE:Java Runtime Environment 的简称,java 运行环境,为 java 的运行提供了所需环境。 具体来说 JDK 其实包含了 JRE,同时还包含了编译 java 源码的编译器 javac,还包含了很多 java 程序 调试和分析的工具。 简单来说:如果你需要运行 java 程序,只需安装 JRE 就可以了,原创 2021-01-27 00:00:31 · 106 阅读 · 0 评论