
牛客网题目总结
牛客网题目总结
小镇攻城狮
吃饭的家伙要拿稳咯
展开
-
刷题48-模幂运算
原题链接题目描述示例输入:a = 2, b = [3]输出:8输入:a = 2, b = [1,0]输出:1024参考解法/** * 模幂运算 * @param a * @param b * @return */public int superPow(int a, int[] b) { int n = b.length; if (n <= 0) return 1; ArrayList<Integer> arr = n原创 2021-01-08 15:47:54 · 361 阅读 · 0 评论 -
刷题47-计算n以内素数的个数
要以一种相对高效的方式计算n以内素数的个数(不包含n)解法1 穷举int countPrimes(int n) { int count = 0; for (int i = 2; i < n; i++) if (isPrim(i)) count++; return count;}// 判断整数 n 是否是素数boolean isPrime(int n) { for (int i = 2; i * i < n; i++) i原创 2021-01-08 11:42:59 · 429 阅读 · 0 评论 -
刷题46-目的地最短步数(BFS)
原题链接题目描述考虑你从家出发步行去往一处目的地,该目的地恰好离你整数单位步长(大于等于1)。你只能朝向该目的地或者背向该目的地行走,而你行走的必须为单位步长的整数倍,且要求你第N次行走必须走N步。请就给出目的地离你距离,判断你是否可以在有限步内到达该目的地。如果可以到达的话,请计算到达目的地的最短总步数(不能到达则输出-1)。示例输入:2输出:3说明:距离目的地2, 需要3步:朝向走1,背向走2,朝向走3参考代码import java.util.*;public clas原创 2020-12-19 16:42:12 · 382 阅读 · 2 评论 -
刷题45-固定体积的最大价值(背包问题)
原题链接题目描述第1行有2个整数,物品种数n和背包装载体积v;第2行到i+1行每行3个整数,为第i种物品的数量m、体积w、价值s。示例输入:2 103 4 32 2 5输出:13参考解法import java.util.ArrayList;import java.util.List;import java.util.Scanner;public class Main { private static class Good { // 体积 i原创 2020-12-19 15:36:24 · 456 阅读 · 3 评论 -
刷题44-最长递增子序列
原题链接题目描述给定一个序列 An = a1 ,a2 , ... , an ,找出最长的子序列使得对所有 i < j ,ai < aj 。求出这个子序列的长度示例输入:1 -1 2 -2 3 -3 4输出:4参考代码public static void solve(int[] a) { // dp[i]表示从a[0]到a[i]的最长递增子序列长度 int dp[] = new int[a.length]; int max = 1; Arr原创 2020-12-17 17:30:37 · 672 阅读 · 0 评论 -
刷题43-分解整数使其乘积最大
原题链接题目描述给出一个整数n,将n分解为至少两个整数之和,使得这些整数的乘积最大化,输出能够获得的最大的乘积。例如:2=1+1,输出1;10=3+3+4,输出36。示例输入:10输出:36参考代码import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in);原创 2020-12-16 20:08:03 · 839 阅读 · 0 评论 -
刷题42-m升水倒入n个杯子(动态规划)
原题链接题目描述要把m升的水倒入n个相同的容器中(假设容器足够大),允许有的容量是空的,问共有多少种不同的倒法?5,1,1和1,5,1和1,1,5是同一种倒法。示例输入:7 3输出:8参考解析1. 不妨设 f(m,n)为 把m升水倒入n个容器的总的方法数。2. m>=n 可以分为两种情况,一种是n个容器内都一定有水,一种是n个容器内至少有一个没有水,这两种情况完全独立。对于第一种,我们先将m中分出n升水,依次倒入每个桶,这样每个桶都一定有水,那么接下来的水的分配就是f(m-原创 2020-12-16 16:13:34 · 628 阅读 · 0 评论 -
刷题41-凑零钱问题(贪心算法)
原题链接题目描述楚乔、宇文玥和燕洵在日本旅行,经过了几天的游玩之后,钱包里出现了大量硬币,楚乔决定用钱包里的硬币为宇文玥和燕洵在自动贩卖机买水。楚乔的钱包里有1元、5元、10元、50元、100元和500元硬币,各C1,C5,C10,C50,C100,C500枚。现在要用这些硬币来到自动贩卖机买价格为A的饮料,假设自动贩卖机所需的硬币金额必须是刚刚好,不能多也不能少,最少需要多少枚硬币?限制条件:0≤ C1,C5,C10,C50,C100,C500≤10000000000≤A≤100000原创 2020-12-15 20:18:19 · 1121 阅读 · 0 评论 -
刷题40-最大矩形面积
原题链接题目描述给出一个只包含0和1的二维矩阵,找出最大的全部元素都是1的长方形区域,返回该区域的面积。示例输入:matrix = [ ["1","0","1","0","0"], ["1","0","1","1","1"], ["1","1","1","1","1"], ["1","0","0","1","0"]]输出:6解释:最大矩形如上图所示。解析每一层加上上面的层,将他们看作是柱状图。第一层柱状图的高度["1","0","1","0","0"],最大面积为1;原创 2020-12-13 11:49:11 · 357 阅读 · 0 评论 -
刷题39-最小覆盖子串(滑动窗口)
原题链接题目描述给出两个字符串 S 和 T,要求在O(n)的时间复杂度内,在 S 中找出最短的,包含 T 中所有字符的子串。例如:S ="XDOYEZODEYXNZ"T ="XYZ"找出的最短子串为"YXNZ"注意:如果 S 中没有包含 T 中所有字符的子串,返回空字符串 “”;满足条件的子串可能有很多,但是题目保证满足条件的最短的子串唯一。示例输入:"XDOYEZODEYXNZ","XYZ"输出:"YXNZ"参考解析这道题的思路是:1) begin开始指向0, end原创 2020-12-11 11:38:03 · 176 阅读 · 0 评论 -
刷题38-N皇后问题
原题链接题目描述N皇后问题是把N个皇后放在一个N×N棋盘上,使皇后之间不会互相攻击。即任意两个皇后都不能处于同一行、同一列或同一对角线上(正反)。示例输入:4输出:[".Q..", // 解法 1 "...Q", "Q...", "..Q."], ["..Q.", // 解法 2 "Q...", "...Q", ".Q.."]]解析3皇后问题的图解分析(3皇后问题无解)可用一维数组array[]表示N皇后问题的解,array[i]的值表原创 2020-12-02 23:41:55 · 1378 阅读 · 0 评论 -
刷题37-数组中和为0的三元组
原题链接扩展题目------最接近的三数之和题目描述给出一个有n个元素的数组S,S中是否有元素a,b,c满足a+b+c=0?找出数组S中所有满足条件的三元组。注意: 1.三元组(a、b、c)中的元素必须按非降序排列。(即a≤b≤c) 2.解集中不能包含重复的三元组。示例输入:[-2,0,1,1,2]输出:[[-2,0,2],[-2,1,1]]参考解法import java.util.ArrayList;import java.util.Arrays;public class原创 2020-11-22 22:06:05 · 399 阅读 · 0 评论 -
刷题36-约瑟夫问题
约瑟夫问题(围圈报数问题、丢手绢问题)是刷题中经常遇到的问题,特此总结如下。本文参考了下面这篇博客的代码。算法笔记_029:约瑟夫斯问题(Java)先看下题目描述n个人(编号由 1,2, ..., n)围成一圈,由编号为1的人从1开始报数,报到k的退出,剩下的人继续从1开始报数,直到圈内只剩余1人,求胜利者的编号。(n>0, k>0) 解法如下...原创 2020-11-15 23:07:13 · 368 阅读 · 0 评论 -
刷题35-股票交易两次的最大收益
原题链接题目描述假定你知道某只股票每一天价格的变动。你最多可以同时持有一只股票。但你最多只能进行两次交易(一次买进和一次卖出记为一次交易。买进和卖出均无手续费)。请设计一个函数,计算你所能获得的最大收益。示例输入:[8,9,3,5,1,3]输出:4参考解法参考博客public class Test { public static void main(String[] args) { int a[] = { 6, 10, 22, 5, 75, 65, 80 }; Sys原创 2020-11-14 20:12:14 · 1257 阅读 · 0 评论 -
刷题34-判断括号序列是否合法
原题链接题目描述给出一个仅包含字符'(',')','{','}','['和']',的字符串,判断给出的字符串是否是合法的括号序列。括号必须以正确的顺序关闭,"()"和"()[]{}"都是合法的括号序列,但"(]"和"([)]"不合法。示例输入:"["输出:false输入:"([)]"输出:false参考解法import java.util.Stack;public class Test { /** * 判断括号序列是否合法 用栈来判断 * * @param s原创 2020-11-13 17:25:56 · 1029 阅读 · 0 评论 -
刷题33-数组的所有排列(回溯法)
原题链接题目描述给出一组数字,返回该组数字的所有排列例如:[1,2,3]的所有排列如下:[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2], [3,2,1].(以数字在数组中的位置靠前为优先级,按字典序排列输出。)参考解法import java.util.ArrayList;import java.util.Arrays;public class T_70 { public static void main(String[] args) { int原创 2020-09-30 10:53:20 · 1702 阅读 · 0 评论 -
刷题32-跳跃游戏
原题链接题目描述给出一个非负整数数组,你最初在数组第一个元素的位置。数组中的元素代表你在这个位置可以跳跃的最大长度。判断你是否能到达数组最后一个元素的位置。例如A =[2,3,1,1,4], 返回 true.A =[3,2,1,0,4], 返回 false.示例输入:[2,3,1,1,4]输出:true输入:[3,2,1,0,4]输出:false参考解法// 从后往前遍历public boolean canJump (int[] A) { // 排除特例 if原创 2020-09-30 09:39:46 · 266 阅读 · 0 评论 -
刷题30-括号生成
原题链接题目描述给出n对括号,请编写一个函数来生成所有的由n对括号组成的合法组合。例如,给出n=3,解集为:"((()))", "(()())", "(())()", "()()()", "()(())"示例输入:1输出:["()"]输入:2输出:["(())","()()"]参考解法/**参考 @smartz的解法关键:当前位置左括号不少于右括号图是什么? 节点:目前位置左括号和右括号数(x,y)(x>=y) 边:从(x,y)到原创 2020-09-28 16:06:30 · 911 阅读 · 0 评论 -
刷题31-收集雨水
原题链接题目描述给出n个数字,表示一个高程图,高程图中每一条的宽度为1,请计算下雨之后这个地形可以存储多少水例如给出[0,1,0,2,1,0,1,3,2,1,2,1],返回6.上面的高程图用数组[0,1,0,2,1,0,1,3,2,1,2,1]表示。在这种情况下,6个单位的雨水(蓝色部分)被存储。示例输入:[0,1,0,2,1,0,1,3,2,1,2,1]输出:6参考解法public class Main { public static void main(Strin原创 2020-09-29 09:47:05 · 498 阅读 · 0 评论 -
刷题29-股票收益
原题链接题目描述假设你有一个数组,其中第i个元素表示某只股票在第i天的价格。设计一个算法来寻找最大的利润。你可以完成任意数量的交易(例如,多次购买和出售股票的一股)。但是,你不能同时进行多个交易(即,你必须在再次购买之前卖出之前买的股票)。示例输入:[1,4,2]输出:3参考解法 // 问题可以转化成统计所有的递增量public int maxProfit(int[] prices) { int count = 0; for (int i = 0; i < prices原创 2020-09-28 10:40:37 · 1571 阅读 · 0 评论 -
刷题28-罗马数字和阿拉伯数字转换
1 阿拉伯数字转罗马数字// 数字转罗马数字public static String intToRoman(int num) { int[] values = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 }; String[] strs = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" }; StringBuilder sb = ne原创 2020-09-28 09:42:53 · 850 阅读 · 0 评论 -
刷题27-分糖果问题
原题链接题目描述一群孩子做游戏,现在请你根据游戏得分来发糖果,要求如下:1. 每个孩子不管得分多少,起码分到一个糖果。2. 任意两个相邻的孩子之间,得分较多的孩子必须拿多一些糖果。(若相同则无此限制)给定一个数组arr代表得分数组,请返回最少需要多少糖果。[要求]时间复杂度为O(n), 空间复杂度为O(1)示例输入:[2, 4, 1, 5, 3]输出:7说明:分配方案为:1,2,1,2,1参考解法/**1、与前面的邻居比较,前向遍历分数数组,2、与后面的邻居比较,后向原创 2020-09-27 20:55:59 · 2095 阅读 · 0 评论 -
刷题26-求字符串的所有子串,并去重,且按长度排序
原题链接题目描述输入一个字符串,输出该字符串中相邻字符的所有组合。举个例子,如果输入abc,它的组合有a、b、c、ab、bc、abc。(注意:输出的组合需要去重,且按照长度排序)输入描述一个字符串输出描述一行,每个组合以空格分隔,相同长度的组合需要以字典序排序,且去重。示例输入:bac输出:a b c ac ba bac参考解法import java.util.ArrayList;import java.util.Collections;import java.ut原创 2020-09-26 10:37:18 · 456 阅读 · 0 评论 -
刷题25-数组中最长的连续自然数子序列的长度
原题链接题目描述给定无序数组arr,返回其中最长的连续序列的长度(要求值连续,位置可以不连续,例如 3,4,5,6为连续的自然数)示例输入一个数组:[100,4,200,1,3,2]输出长度:4输入:[1,1,1]输出:1参考代码public static int MLS(int[] a) { // 先排序 Arrays.sort(a); int max = 1, sum = 1; for (int i = 0; i < a.length - 1; i原创 2020-09-23 10:45:58 · 951 阅读 · 0 评论 -
刷题24-求两个字符串的最长公共子序列的长度
原题链接题目描述给定两个字符串str1和str2,输出连个字符串的最长公共子序列。如过最长公共子序列为空,则输出-1。输入描述输出包括两行,第一行代表字符串str1,第二行代表str2。(1≤length(str1),length(str2)≤5000)输出描述输出一行,代表他们最长公共子序列。如果公共子序列的长度为空,则输出-1。示例输入:1A2C3D4B56B1D23CA45B6A输出:123456说明:"123456"和“12C4B6”都是最长公共子序列,任意输出原创 2020-09-11 10:48:59 · 1727 阅读 · 0 评论 -
刷题23-丑数
原题链接题目描述把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。参考解法public class T_22 { public static int GetUglyNumber_Solution(int index) { if (index == 0) { return 0; } int[] arr = new int[index]; a原创 2020-09-01 10:44:10 · 881 阅读 · 0 评论 -
刷题22-机器人的运动范围
原题链接题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?参考解法(回溯法遍历整个数组)public class test { public int movingCount(int k,原创 2020-09-01 09:28:39 · 266 阅读 · 0 评论 -
刷题21-把数组组成一个最小的数
原题链接题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。示例输入:一个数组{3,32,321}输出:321323参考代码public class test { public static void main(String[] args) { int a[] = { 3, 32, 321 }; System.out.println(Print原创 2020-08-31 16:23:47 · 353 阅读 · 0 评论 -
刷题20-求字符串中第一个只出现一次的字符
原题链接题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。输入描述一个字符串输出描述第一个只出现一次的字符。若没有,则输出-1。示例输入:go输出:g输入:google输出:l参考解法import java.util.LinkedHashMap;import java.util.Map;i原创 2020-08-28 20:44:50 · 234 阅读 · 0 评论 -
刷题19-剪绳子
原题链接题目描述给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],...,k[m]。请问k[1]x...xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。输入描述输入一个数n。(2 <= n <= 60)输出描述输出最大乘积。示例输入:8输出:18参考解法(主要看分析部分)public cl原创 2020-08-28 16:54:06 · 106 阅读 · 0 评论 -
刷题18-大整数相乘
原题链接题目描述有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。输入描述空格分隔的两个字符串,代表输入的两个大整数输出描述输入的乘积,用字符串表示示例输入:72106547548473106236 982161082972751393输出:70820244829634538040848656466105986748参考解法:import java.util.Scanner;public class Main { pub原创 2020-08-25 10:04:25 · 256 阅读 · 0 评论 -
刷题17-打印回形数
原题链接题目描述回形数是一个矩阵输出,从矩阵的左上角往右开始打印数字0,遇到矩阵边界时,顺时针90方向继续打印,并数字增长1,如此类推直到把矩阵填满,输入一个整形宽和高单位,每输出一个数字,占用1单位宽高空间,根据入参打印出对应的回形数输入描述矩阵的宽高输出描述回字形的矩阵示例输入:8 3输出:000000003444444122222221参考解法/**这道题的主要难点是,怎么设置循环。这里用赋值的个数来控制循环(count),用now表示当前应该赋的值原创 2020-08-23 15:59:51 · 260 阅读 · 0 评论 -
刷题16-数独问题
原题链接题目描述数独是一个非常有名的游戏。整个是一个9X9的大宫格,其中又被划分成9个3X3的小宫格。要求在每个小格中放入1-9中的某个数字。要求是:每行、每列、每个小宫格中数字不能重复。 现要求用计算机求解数独。输入描述输入9行,每行为空格隔开的9个数字,为0的地方就是需要填充的数字。输出描述输出九行,每行九个空格隔开的数字,为解出的答案。示例输入:0 9 0 0 0 0 0 6 08 0 1 0 0 0 5 0 90 5 0 3 0 4 0 7 00 0 8 0 7 0原创 2020-08-22 16:47:57 · 1548 阅读 · 0 评论 -
刷题15-求两个字符串的最长公共连续子串的长度
原题链接题目描述有两个字符串(可能包含空格),请找出其中最长的公共连续子串,输出其长度。输入描述给定两行字符串长度在1000以内输出描述输出这两个字符串的最长公共连续子串的长度示例输入:abcdebcd输出:3参考解法:import java.util.Scanner;public class T_67 { public static void main(String[] args){ Scanner sc = new Scanner(System.原创 2020-08-19 16:34:23 · 1408 阅读 · 0 评论 -
刷题14-编辑距离(动态规划)
原题链接题目描述给定两个字符串,已知可以使用三种方式进行变换1. 插入一个字符2. 删除一个字符3. 更改一个字符请设计一个算法,找到两个字符串之间的经历几次最小变换,可以字符串1转换成字符串2输入描述输入两个字符串,字符串的长度<=1000输出描述最小变换次数示例输入:hellohelle输出:1输入:horseros输出:3输入:intentionexecution输出:5参考解法import java.util.Scanne原创 2020-08-19 10:31:57 · 212 阅读 · 0 评论 -
刷题13-计算数组的维度
原题链接题目描述输入参数为字符串型的n维数组,数组的每一项值为数组 或 int型数字。请实现一个函数,可以获取列表嵌套列表的最大深度为多少。输入描述输入参数为字符串型的 n维数组,列表的每一项值为数组 或 int型数字。数组内的数组,每一项值,也可以是数组 或 int型数字。输出描述int型数字,表示数组嵌套的深度。示例输入:[[1], [2,3,4], [5,[2,3]], [7], [0,[1,2,3,4],3,5], [1,3], [3,2,4]]输出:3输入:[原创 2020-08-18 16:33:32 · 390 阅读 · 0 评论 -
刷题12-鸡鸭分类问题
原题链接题目描述农场有n只鸡鸭排为一个队伍,鸡用“C”表示,鸭用“D”表示。当鸡鸭挨着时会产生矛盾。需要对所排的队伍进行调整,使鸡鸭各在一边。每次调整只能让相邻的鸡和鸭交换位置,现在需要尽快完成队伍调整,你需要计算出最少需要调整多少次可以让上述情况最少。例如:CCDCC->CCCDC->CCCCD这样就能使之前的两处鸡鸭相邻变为一处鸡鸭相邻,需要调整队形两次。输入描述输入一个长度为N,且只包含C和D的非空字符串。输出描述使得最后仅有一对鸡鸭相邻,最少的交换次数示例原创 2020-08-18 12:51:38 · 347 阅读 · 0 评论 -
刷题11-拼凑正方形
原题链接题目描述牛牛有4根木棍,长度分别为a,b,c,d。羊羊家提供改变木棍长度的服务,如果牛牛支付一个硬币就可以让一根木棍的长度加一或者减一。牛牛需要用这四根木棍拼凑一个正方形出来,牛牛最少需要支付多少硬币才能让这四根木棍拼凑出正方形。输入描述输入包括一行,四个整数a,b,c,d(1 ≤ a,b,c,d ≤ 10^6), 以空格分割输出描述输出一个整数,表示牛牛最少需要支付的硬币示例输入:4 1 5 4输出:4参考解法/**思路:设排序后为a,b,c,d,因为原创 2020-08-18 10:16:53 · 378 阅读 · 0 评论 -
刷题10-关灯游戏
原题链接题目描述在Alice生日的那天,Bob送给了她n个灯泡。他们决定用这些灯泡玩一个游戏:他们把这些灯泡从左往右排成一行,在初始时,有些灯泡是点亮的,有些灯泡是熄灭的。接下来,他们轮流进行操作,Alice首先操作。在每一次操作中,轮到操作的人需要选择一个点亮的灯泡,然后把它以及它右边的所有灯泡的状态进行一次改变,即把点亮的灯泡熄灭,把熄灭的灯泡点亮。如果在某一个人操作完之后,所有的灯泡都变成了熄灭状态,那么那个人就赢得了游戏。Alice和Bob都想赢得游戏,在他们都足够聪明的情况下原创 2020-08-16 15:36:52 · 1475 阅读 · 0 评论 -
刷题09-生成格雷码
原题链接题目描述在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同, 则称这种编码为格雷码(Gray Code),请编写一个函数,使用递归的方法生成N位的格雷码。给定一个整数n,请返回n位的格雷码,顺序为从0开始。测试样例输入:1返回(一个字符串数组):["0","1"]参考解法:// 参考 @RedstoneCMX @第1024只猴子 两位大佬的解法//递归的思路就是n位gray码是由n-1位gray码生成,举个例子简单一些://比如求n=3的gray码,首先知原创 2020-08-14 11:42:00 · 121 阅读 · 0 评论