![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
牛客编程习题
在牛客上刷的题,进行详细的分析
一只可爱的小狐狸
我亦无他,惟手熟尔
展开
-
50.最长公共前缀
50.最长公共前缀题目描述编写一个函数来查找字符串数组中的最长公共前缀。输入["abca","abc","abca","abc","abcc"]返回值"abc"分析1.首先对String数组进行判空处理,为了达到代码的健壮性2.对String数组进行排序3.遍历首尾的字符串,若有不相等的,跳出循环。4.截取前面公共的字符串,即就是最长公共字符串前缀代码实现 import java.util.*; public class Solution { publ原创 2021-04-01 21:12:43 · 292 阅读 · 1 评论 -
49.在转动的有序数组中寻找目标值
49.在转动的有序数组中寻找目标值题目描述给出一个转动过的有序数组,你事先不知道该数组转动了多少(例如,0 1 2 4 5 6 7可能变为4 5 6 7 0 1 2).在数组中搜索给出的目标值,如果能在数组中找到,返回它的索引,否则返回-1。假设数组中不存在重复项。输入[3,2,1],1返回值2分析1.无论该数组转动多少次,我们都可以通过遍历来获取得到他的下标值2.将目标值与遍历的数组中的元素值比较即可,如果相等就返回该元素是下标,如果遍历完成后,还是没有找到与目标值相等的,那么原创 2021-03-31 10:35:23 · 1017 阅读 · 0 评论 -
48.反转数字
48.反转数字题目描述将给出的32位整数x翻转。例1:x=123,返回321例2:x=-123,返回-321你有注意到翻转后的整数可能溢出吗?因为给出的是32位整数,则其数值范围为−2^{31}, 2^{31} − 1。翻转可能会导致溢出,如果反转后的结果会溢出就返回 0。输入-123返回值-321分析1.要反转数字,首先需要获取到每一位的数字,然后才可以进行反转2.那么就先获取到最后一位数字,对输入的数字取余即可获取到最后一位数字3.然后给他加在新的结果上,因为是反转嘛,所以原创 2021-03-30 16:15:25 · 1625 阅读 · 2 评论 -
47.环形链表的约瑟夫问题
47.环形链表的约瑟夫问题题目描述编号为1到n的n个人围成一圈。从编号为1的人开始报数1,依次下去,报到m的人离开,问最后留下的一个人,编号是多少?输入5,2返回值3分析最终剩下一个人时的安全位置肯定为1,反推安全位置在人数为n时的编号人数为1: 0+1人数为2: (0+m) % 2+1人数为3: ((0+m) % 2 + m) % 3+1人数为4: (((0+m) % 2 + m) % 3 + m) % 4+1代码实现import java.util.*;原创 2021-03-29 09:00:24 · 1995 阅读 · 4 评论 -
46.数组中最长的连续子序列
46.数组中最长的连续子序列题目描述给定无序数组arr,返回其中最长的连续序列的长度(要求值连续,位置可以不连续,例如 3,4,5,6为连续的自然数)输入[100,4,200,1,3,2]返回值4输入[1,1,1]返回值1分析1.由题意可得,重复的元素不计,所以我们采取Set方法,自动去重2.然后继续比较,如果集合包含当前元素+1后的元素,就给计数器++;3.直到遍历完整个集合,这样就可以获取到最长连续的子序列代码实现 import java.util.*;原创 2021-03-28 19:29:33 · 2024 阅读 · 3 评论 -
45.买股票的最佳时机
45.买股票的最佳时机题目描述假设你有一个数组,其中第\ i i 个元素是股票在第\ i i 天的价格。你有一次买入和卖出的机会。(只有买入了股票以后才能卖出)。请你设计一个算法来计算可以获得的最大收益。输入[1,4,2]返回值3输入[2,4,1]返回值2分析1.主要就是一个极端的思想,只能购买和出售一次,低价买高价卖2.然后就是代码实现了,调用Math方法获取到最高最低时候的价格代码实现 import java.util.*; public class原创 2021-03-27 16:08:41 · 138 阅读 · 0 评论 -
44.数组中只出现一次的两个数字
44.数组中只出现一次的两个数字题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字输入[1,4,1,6]返回值[4,6]分析1.写一个判断条件,把数组加在集合里面2.然后在输出一下就可以了代码实现 import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可原创 2021-03-26 12:41:48 · 138 阅读 · 1 评论 -
43.把数组排成最小的数
43.把数组排成最小的数题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。输入[3,32,321]返回值"321323"分析1.将数组先排好顺序2.定义一个空字符串3.遍历数组,将空串与数组中的每一个元素相加,调用compare to方法代码实现 import java.util.ArrayList; import java.util.A原创 2021-03-25 16:20:14 · 1040 阅读 · 4 评论 -
42.整数中1出现的次数
42.整数中1出现的次数题目描述求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。输入13返回值6分析1.将输入的数字从n到1遍历一次,把它拼接成一个字符串2.因为String的最大长度是65534,而int的最大范围是2^31,原创 2021-03-24 09:30:45 · 2210 阅读 · 6 评论 -
41.寻扎第K大
41.寻扎第K大题目描述有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。输入[1,3,5,2,2],5,3返回值2分析1.用集合来解决此问题代码实现 import java.util.*; public class Solution { public int findKth(int[] a, int n, int K) {原创 2021-03-23 18:52:01 · 864 阅读 · 2 评论 -
40.在两个长度相等的排序数组中找到上中位数
40.在两个长度相等的排序数组中找到上中位数题目描述给定两个有序数组arr1和arr2,已知两个数组的长度都为N,求两个数组中所有数的上中位数。上中位数:假设递增序列长度为n,若n为奇数,则上中位数为第n/2+1个数;否则为第n/2个数[要求]时间复杂度为O(logN)O(log**N),额外空间复杂度为O(1)O(1)输入[1,2,3,4],[3,4,5,6]返回值3说明总共有8个数,上中位数是第4小的数,所以返回3。 输入[0,1,2],[3,4,5]返回值2说原创 2021-03-22 11:17:09 · 343 阅读 · 2 评论 -
39.最大公约数
39.最大公约数题目描述求出两个数的最大公约数,如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数。几个自然数公有的约数,叫做这几个自然数的公约数。公约数中最大的一个公约数,称为这几个自然数的最大公约数。输入3,6返回值3输入8,12返回值4分析1.运用数学思想,代买实现即可代码实现 import java.util.*; public class Solution { /** * 代码中的类原创 2021-03-20 17:04:47 · 182 阅读 · 1 评论 -
38.记负均正
38.记负均正题目描述首先输入要输入的整数个数n,然后输入n个整数。输出为n个整数中负数的个数,和所有正整数的平均值,结果保留一位小数。本题有多组输入用例。输入51 2 3 4 5输出0 3.0分析1.思路很简单,照着题目要求来即可2.然后在按照要求格式化数据输出即可代码实现 import java.util.Arrays; import java.util.Scanner; public class Main8 { public stati原创 2021-03-19 16:27:40 · 152 阅读 · 0 评论 -
37.表示数字
37.表示数字题目描述将一个字符中所有的整数前后加上符号“*”,其他字符保持不变。连续的数字视为一个整数。注意:本题有多组样例输入。输入Jkdi234klowe90a35151输出Jkdi*234*klowe*90*a*3**5151*分析1.给字符串有数字部分前面先加一个“*”2.然后让含有数字这部分的字符串进入一个循环3.判断数字有多少,如果一直是数字的话,就一直拼接4.不是数字的时候跳出循环代码实现 import java.util.Scanner;原创 2021-03-18 20:26:05 · 407 阅读 · 3 评论 -
36.牛牛的Fib数列
36.牛牛的Fib数列题目描述牛牛重新定义了斐波那契数列,牛牛定义f(n) = f(n-1)+f(n+1); f(1)=a, f(2)=b, 现在给定初始值 a, b,现在求第n项f(n)%1000000007的值。其中 1<=|x|, |y|, n<=10^9输入1,2,3返回值1说明f(2)=f(3)+f(1), 所以f(3) = f(2)-f(1)=2-1=1输入-1,-2,3返回值1000000006说明同样例1:f(3)=-1%100000000原创 2021-03-17 09:09:29 · 191 阅读 · 2 评论 -
35.热心的牛牛
35.热心的牛牛题目描述这一天你跟你的n个朋友一起出去玩,在出门前妈妈给了你k块糖果,你决定把这些糖果的一部分分享给你的朋友们。由于你非常热心,所以你希望你的每一个朋友分到的糖果数量都比你要多(严格意义的多,不能相等)。求你最多能吃到多少糖果?输入2,10返回值2分析1.加上牛牛总共是n+1个人,首先平分每个人得到k/(n+1)个糖果2.如果还剩下n个糖,每个朋友在分一个,如果剩不了n个,牛牛在牺牲一个代码实现 import java.util.*;原创 2021-03-16 16:34:37 · 303 阅读 · 1 评论 -
34.最长公共子串
34.最长公共子串题目描述给定两个字符串str1和str2,输出两个字符串的最长公共子串题目保证str1和str2的最长公共子串存在且唯一。输入"1AB2345CD","12345EF"返回值"2345"分析1.调用字符串里面的方法,截取子串,2.如果str1包含str2里面的子串,那么就继续向前截取直到截取的子串不在str1里面3.返回所截取的子串就为最长公共子串代码实现 import java.util.*; public class Solu原创 2021-03-15 21:35:10 · 448 阅读 · 4 评论 -
33.数组中未出现的最小正数
33.数组中未出现的最小正数题目描述给定一个无序数组arr,找到数组中未出现的最小正整数例如arr = [-1, 2, 3, 4]。返回1arr = [1, 2, 3, 4]。返回5[要求]时间复杂度为O(n)O(n),空间复杂度为O(1)O(1)输入[-1,2,3,4]返回值1分析1.最小正数是1,所以从1开始比较2.如果相等就给1+1;一直循环3.直到数组中没有该数字时,跳出循环代码实现 import java.util.*; pub原创 2021-03-15 10:39:48 · 1473 阅读 · 2 评论 -
32.将字符串转换为数字
32.将字符串转换为数字题目描述实现函数 atoi 。函数的功能为将字符串转化为整数提示:仔细思考所有可能的输入情况。这个问题没有给出输入的限制,你需要自己考虑所有可能的情况。输入"123"返回值123分析1.对字符串进行判空处理,如果字符串为空,则返回值为02.然后将字符串转换为一个char型的数组3.判断正负号4.判断会不会越界,会越界的时候直接输出结果5.如果遇到字母直接退出代码实现 import java.util.*; public class Sol原创 2021-03-14 21:07:11 · 2618 阅读 · 8 评论 -
31.括号序列
31.括号序列题目描述给出一个仅包含字符’(’,’)’,’{’,’}’,’[‘和’]’,的字符串,判断给出的字符串是否是合法的括号序列括号必须以正确的顺序关闭,"()“和”()[]{}“都是合法的括号序列,但”(]“和”([)]"不合法。输入"["返回值false输入"[]"返回值true分析1.由题意可得,括号必须是成对出现才符合2.所以可以利用String里面的replace方法,对成对的括号进行替换3.若替换完成,即就是所有的括号全部替换成了空格,那么此时的字符串原创 2021-03-13 18:38:40 · 3414 阅读 · 9 评论 -
30.数组中出现次数超过一半的数字
30.数组中出现次数超过一半的数字题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。输入[1,2,3,2,2,2,5,4,2]返回值2分析1.按照题目要求数组中一定会出现一个数字出现的次数是数组长度的一半以上2.所以对数组先排序,确保那个重复出现的数字排在一起,这样无论在那一块我们就可以知道只要有这样的一个数字就一定会满原创 2021-03-12 21:21:14 · 1406 阅读 · 0 评论 -
29.大数加法
29.大数加法题目描述以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。(字符串长度不大于100000,保证字符串仅由’0’~'9’这10种字符组成)输入"1","99"输出"100"说明1+99=100分析1.调用BigInteger方法,确保是数字字符串2.调用BigInteger里面的add()方法直接获取返回值代码实现 import java.util.*; import java.math.BigInteger; p原创 2021-03-12 12:28:56 · 1779 阅读 · 6 评论 -
28.大数乘法
28.大数乘法题目描述以字符串的形式读入两个数字,编写一个函数计算它们的乘积,以字符串形式返回。(字符串长度不大于10000,保证字符串仅由’0’~'9’这10种字符组成)输入"11","99"返回值"1089"说明11*99=1089分析1.简单的可以理解为数字字符串的乘法,直接用BigInter即可代码实现 import java.util.*; import java.math.BigInteger; public class Solution原创 2021-03-11 20:30:52 · 937 阅读 · 0 评论 -
27.缺失数字
27.缺失数字题目描述从0,1,2,…,n这n+1个数中选择n个数,组成有序数组,请找出缺失的那个数,要求O(n)尽可能小。输入[0,1,2,3,4,5,7]返回值6分析1.题目要求是一个有序数组,而且中间只是差一个数字,也就是说差的这个数字和数组下标一样,所以我们可以通过访问下标的方式来确定所缺失的是哪个数字,然后在返回该数字就好代码实现 import java.util.*; public class Solution { /**原创 2021-03-11 16:07:06 · 801 阅读 · 0 评论 -
26.好数
26.好数题目描述若一个数的首位和末位相等,则定义这个数为“好数”。例如:1231、4512394是好数,而12345、768740则不是好数。请你编写一个函数,判断是不是好数。如果是好数则返回true,否则返回false。输入1231返回值true说明首位和末位都是1,相等。 分析1.将int类型转换为String类型,然后调用String中的方法即可实现比较代码实现 import java.util.*; public class So原创 2021-03-10 21:25:12 · 2145 阅读 · 2 评论 -
25.喝酒
25.喝酒题目描述一瓶酒m元钱,两个酒瓶可以换一瓶酒,四个瓶盖可以换一瓶酒,现在有 n 元钱,求最多可以喝多少瓶酒?(注:没有借贷功能,即最终不允许借一瓶酒、喝完后拿酒瓶兑换归还的操作)输入2,12返回值19分析1.我先是第一眼觉得需要自己找到规律,然后在代码实现的,发现有点困难2.直接写就好了,n/m是刚开始买的酒数,然后继续用瓶盖和酒瓶换酒3.换酒的这个过程,我刚开始觉得是较难实现的,困难的复杂的事情交给计算机执行,把它写入死循环里面,然后累加即可!代码实现 import原创 2021-03-10 12:02:22 · 1421 阅读 · 4 评论 -
24.数学实验
24.数学实验题目描述给出一个数字n,需要不断地将所有数位上的值做乘法运算,直至最后数字不发生变化为止。问最后生成的数字为多少?输入10返回值0输入55返回值0说明55 -> 5 * 5 = 25 -> 2 * 5 = 10 -> 1 * 0 = 0 分析1.因为是一个不确定位数的数字,所以需要对该数字进行不断的取模和除以10,就可以取到每一位的数字了2.为什么在这里定义为1?因为每次需要对其实现“归零操作”,就是保证下一次可以顺利的进行3.最原创 2021-03-09 21:46:37 · 1710 阅读 · 0 评论 -
23.牛牛找数
23.牛牛找数题目描述牛牛有两个数a和b,他想找到一个大于a且为b的倍数的最小整数,只不过他算数没学好,不知道该怎么做,现在他想请你帮忙。给定两个数a和b,返回大于a且为b的倍数的最小整数。输入3,2返回值4分析1.没什么好说的,举例然后找规律2.代码实现规律即可代码实现import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直原创 2021-03-09 16:08:42 · 2180 阅读 · 3 评论 -
22.拆数
22.拆数题目描述把一个数拆成两个不相等的正整数之和,一共有多少种拆法。给定一个数n,返回将这个数n拆成两个不相等的正整数之和一共有多少种拆法。注:3=1+2和3=2+1视为同一种拆法。输入3返回值1分析1.题目做的多了,也就明白了一个模式,就像那种定性的思维一样2.举例找规律,然后用代码的方式表达出来即可代码实现 import java.util.*; public class Solution { /** * 代码中的类名、方法名原创 2021-03-08 18:28:17 · 2566 阅读 · 5 评论 -
21.牛牛掷硬币
21.牛牛掷硬币题目描述掷了n次硬币,如果这n次硬币全部朝上或者全部朝下的概率是多少?(每次掷硬币朝上的概率与朝下的概率相同)输入1返回值"1.00"输入5返回值"0.06"分析1.纯粹的将投掷的次数乘方,因为是正反面,所以给最后的结果乘以2即可2.按题目要求格式输出代码实现 import java.util.*; public class Solution { /** * 返回一个严格四舍五入保留两位小数的原创 2021-03-08 17:01:10 · 2490 阅读 · 2 评论 -
20.旋转字符串
20.旋转字符串题目描述字符串旋转:给定两字符串A和B,如果能将A从中间某个位置分割为左右两部分字符串(都不为空串),并将左边的字符串移动到右边字符串后面组成新的字符串可以变为字符串B时返回true。例如:如果A=‘youzan’,B=‘zanyou’,A按‘you’‘zan’切割换位后得到‘zanyou’和B相同返回true。输入"youzan","zanyou"返回值true分析1.将A字符串转换为一个char类型的数组,然后从中间开始拼接2.中间拼接好了,在从前面开始拼接3原创 2021-03-07 19:46:24 · 2695 阅读 · 7 评论 -
19.三个数的最大乘机
19.三个数的最大乘机题目描述给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)。输入[3,4,1,2]返回值24分析1.直接计算即可,先对数组排序2.然后计算比较即可代码实现import java.util.*; public class Solution { /** * 最大乘积 * @param A int整型一维数组 *原创 2021-03-07 09:13:50 · 1189 阅读 · 3 评论 -
18.数字在数组中出现的次数
18.数字在数组中出现的次数题目描述统计一个数字在数组中出现的次数输入[1,2,3,3,3,3,4,5],3返回值4分析1.在数组中对指定k值做判断,如果相等于数组里面的值,就让累加器加1代码实现public class Solution { public int GetNumberOfK(int[] array, int k) { int temp = 0; for (int i = 0; i < array.length; i++) { if (k ==原创 2021-03-06 10:20:50 · 1116 阅读 · 0 评论 -
17.矩形覆盖
17.矩形覆盖题目描述我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?比如n=3时,2*3的矩形块有3种覆盖方法:输入4返回值5分析1.遇到此类问题。首先列举几个,然后从中找规律2.便会发现本题是斐波那契数列的变形,所以要熟练的掌握斐波那契数列代码实现public class Solution { public int rectCover(int target) { if(ta原创 2021-03-05 15:31:53 · 1141 阅读 · 0 评论 -
16.变态跳台阶
16.变态跳台阶题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。输入3返回值4分析1.遇到此类问题时,应该列举出几组数据从中找其规律2.f(1)=1;f(2)=2;f(3)=4;f(5)=8;f(6)=16……3.可以得出其规律为当n>时,f(n)=2*f(n-1);代码实现 public class Solution { public int jumpFloorII(int targ原创 2021-03-05 11:26:53 · 1068 阅读 · 0 评论 -
15.斐波那锲数列
15.斐波那锲数列题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。输入4返回值3分析1.递归思想,调用斐波那契数列,重复的自己调用自己2.斐波那契数列就是当n<3的时候,结果为1 ,大于3的时候为f(n-1)+f(n-2);3.斐波那契数列(Fibonacci sequence),又称黄金分割数列、兔子数列,是数学家列昂纳多·斐波那契于1202年提出的数列。斐波那契数列为1、1、2、3、5、8、13、2原创 2021-03-04 19:51:53 · 1859 阅读 · 1 评论 -
14.替换空格
14.替换空格题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。输入"We Are Happy"返回值"We%20Are%20Happy"分析1.调用String中的replace()方法即可代码实现public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 *原创 2021-03-04 16:21:48 · 1072 阅读 · 1 评论 -
13.找到字符串的最长无重复字符串字串
13.找到字符串的最长无重复字符串字串题目描述给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同)。输入[2,3,4,5]返回值4输入[2,2,3,4,3]返回值3分析1.本来我是想使用Set方法,因为Set,不允许重复,自然而然就去掉重复的了,然后在调用size()方法获取大小即可,给出的样例通过了,不能完全通过2.我就换了个LinkedList,3.removeFirst();返回出现一次的字符串4.然后add();将只出现一次的添原创 2021-03-03 19:02:12 · 1928 阅读 · 1 评论 -
12.两数之和
12.两数之和题目描述给出一个整数数组,请在数组中找出两个加起来等于目标值的数,你给出的函数twoSum 需要返回这两个数字的下标(index1,index2),需要满足 index1 小于index2.。注意:下标是从1开始的假设给出的数组中只存在唯一解例如:给出的数组为 {20, 70, 110, 150},目标值为90输出 index1=1, index2=2输入[3,2,4],6返回值[2,3]分析1.首先要明确一点,要想使此题有解的话,必须满足一点的是,在数组numb原创 2021-03-03 10:31:30 · 1215 阅读 · 0 评论 -
11.跳台阶
11.跳台阶题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。输入1返回值1输入2返回值2输入4返回值5分析1.遇到此类问题,我们可以多列一些,从中找规律2.f(1)=1;f(2)=2;f(3)=4;f(4)=5;由此可以推断出f(n)=f(n-1)+f(n-2);3.跳台阶问题也就是斐波那锲数列的变形,采用递归即可代码实现public class Solution { p原创 2021-03-02 19:20:43 · 1086 阅读 · 0 评论