
剑指Offer
文章平均质量分 54
Apple-yeran
Stay Hungry, Stay Foolish.
展开
-
剑指Offer 46. 把数字翻译成字符串
题目描述:给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。示例1:输入: 12258输出: 5解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"方法一:斐波那契数列的变形class Solution { public int transl原创 2021-07-17 10:35:36 · 156 阅读 · 0 评论 -
剑指Offer 14. 剪绳子
题目描述:给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],…,k[m]。请问k[1]×...×k[m]k[1]\times...\times k[m]k[1]×...×k[m]可能的最大乘积是多少?例如,当绳子的长度是8时,把它剪成长度分别为2、3、3的三段,得到的最大乘积是18。示例1:输入:8返回值:18输入描述:输入一个数n,意义见题面。(2 <= n <= 60)返回值描述:输出答案原创 2021-07-16 21:40:30 · 159 阅读 · 0 评论 -
剑指Offer 61. 扑克牌中的顺子
题目描述:现在有2副扑克牌,从扑克牌中随机五张扑克牌,我们需要来判断一下是不是顺子。有如下规则:1.A为1,J为11,Q为12,K为13,A不能视为14;2.大、小王为 0,0可以看作任意牌;3.如果给出的五张牌能组成顺子(即这五张牌是连续的)就输出true,否则就输出false。例如:给出数据[6,0,2,0,4],中间的两个0一个看作3,一个看作5 。即:[6,3,2,5,4],这样这五张牌在[2,6]区间连续,输出true。数据保证每组5个数字,每组最多含有4个零,数组的数取值为 [0, 1原创 2021-07-16 00:31:05 · 288 阅读 · 0 评论 -
剑指Offer 64. 求1 + 2 + ... + n
题目描述:求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。示例1:输入:5返回值:15方法一:不使用if的递归求解1+2+⋯+n1+2+\cdots+n1+2+⋯+n,有以下几种方法:(1)使用高斯公式sum=n(1+n)/2sum=n(1+n)/2sum=n(1+n)/2,但是题目中明确限制使用乘除法,所以此方法不可行。(2)使用循环求解,但是题目中又限制使用for、while,所以此方法也不可行。(3原创 2021-07-15 23:24:09 · 184 阅读 · 0 评论 -
剑指Offer 67. 把字符串转换成整数
题目描述:写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。注意:假如该字符串中的第一原创 2021-07-15 16:50:59 · 206 阅读 · 0 评论 -
剑指Offer 65. 不用加减乘除做加法
题目描述:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。示例1:输入:1,2返回值:3方法一:位运算由于不能使用加减乘除四则运算符号,只能考虑使用位运算。对于求两个数a、b之和,(1) 先计算a、b对应二进制的无进位和;(2) 再计算a、b对应二进制的进位,并将结果左移一位;(3) 将**(1)和(2)中的结果相加**,就是a、b两个数的和。下面以a = 20, b = 17为例分析:循环实现:完成(1)和(2)之后,需要求(1)和(2)之和,这仍然需要加原创 2021-07-15 00:10:43 · 148 阅读 · 0 评论 -
剑指Offer 62. 圆圈中最后剩下的数字
题目描述:有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版。请你试着想下,哪个小朋友会得到这份礼品呢?(注:小朋友的编号是从0到n-1)。如果没有小朋友,请返回-1。本题还有一种描述是:每次从1开始报数,然后报到m,第m个小朋友出列,然原创 2021-07-14 10:54:37 · 188 阅读 · 0 评论 -
剑指Offer 43. 1~n整数中1出现的次数
题目描述:输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。例如,1~13中包含1的数字有1、10、11、12、13,因此共出现6次。示例1:输入:13返回值:6方法一:暴力输入一个整数n,从1开始,遍历到n,对于每次遍历到的整数 i,判断 i 的每一位是否为1,如果为1,count++,否则count不变。public class Solution { public int NumberOf1Between1AndN_Solution(int n) {原创 2021-07-14 10:52:05 · 141 阅读 · 0 评论 -
剑指Offer 10. 斐波那契数列
题目一(求斐波那契数列的第n项)描述:输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1),且n<=39n<=39n<=39。示例1:输入:4返回值:3方法一:递归这种方法就是大学C语言中讲的方法,非常简单,这里不再解释。public class Solution { public int Fibonacci(int n) { if (n == 0 || n == 1) return n; return F原创 2021-07-12 00:53:00 · 292 阅读 · 2 评论 -
剑指Offer 39. 数组中出现次数超过一半的数字
题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例:示例1输入:[1,2,3,2,2,2,5,4,2]返回值:2示例2输入:[3,3,3,3,2,2,2]返回值:3示例3输入:[1]返回值:1方法一:哈希表所有与元素次数相关的问题都可以使用哈希表代码模板解决。import原创 2021-07-11 20:45:31 · 112 阅读 · 0 评论 -
剑指Offer 56. 数组中数字出现的次数
题目一(数组中只出现一次的两个数字)描述:一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。示例:输入:[1,4,1,6]返回值:[4,6]说明:返回的结果中较小的数排在前面 方法一:哈希表已经总结过所有与元素次数相关的问题都可以用哈希表解决。import java.util.*;public class Solution { public int[] FindNumsAppearOnce (int[] array) {原创 2021-07-10 23:35:44 · 204 阅读 · 4 评论 -
剑指Offer 15. 二进制中1的个数
题目描述:输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。示例:输入:10返回值:2方法一:与运算次数等于整数二进制的位数假设一个8位二进制数1101 0101,先将这个二进制数和1(x)相与,如果结果不为0,说明这个二进制数第0位是1;然后再将这个二进制数和2(x)相与,如果结果不为0,说明这个二进制数的第1位是1;再将这个二进制数和4(x)相与,如果结果不为0,说明这个二进制数的第2位是1;一直持续下去,每次这个二进制数相与的数是x(x依次是1, 2, 4, 8, 1原创 2021-07-10 12:26:27 · 86 阅读 · 0 评论 -
剑指Offer 58. 翻转字符串
题目一(翻转单词顺序)描述:输入一个英文句子,反转句子中的单词顺序,但单词内字符的顺序不变。为了简单起见,标点符号和普通字符一样处理。例如输入字符串"I am a student.",则输出"student. a am I"。示例1:输入:"nowcoder. a am I"返回值:"I am a nowcoder."方法一:双指针分析:先翻转整个字符串,再翻转逐个单词。翻转整个字符串很简单,一行代码就可以解决。在翻转每个单词时,指针 i 初始指向第0个字符,然后依次向后遍历,遍历到空格时,它原创 2021-07-08 02:42:08 · 231 阅读 · 0 评论 -
剑指Offer 57. 和为s的数字
题目一(和为s的两个数字)描述:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,返回两个数的乘积最小的,如果无法找出这样的数字,返回一个空数组即可。示例1:输入:[1,2,4,7,11,15],15返回值:[4,11]返回值描述:对应每个测试案例,输出两个数,小的先输出。方法一:使用两个指针分析:题目要求如果有多对数字的和等于S,返回两个数的乘积最小的。由数学知识可知,当两个数的和一定时,它们的差越大,则乘积越小,所以设置两个指针,初始原创 2021-07-08 01:09:04 · 89 阅读 · 0 评论 -
剑指Offer 03. 数组中重复的数字
题目描述:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任一一个重复的数字。 例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出-1。示例1:输入:[2,3,1,0,2,5,3]返回值:2说明:2或3都是对的 方法一:哈希表使用哈希表存放每个元素及其出现的次数,HashMap第一个类型为元素类型(本题元素类型为Integer),第二原创 2021-07-05 23:23:03 · 148 阅读 · 2 评论 -
剑指Offer 04. 二维数组中的查找
题目描述:在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例:现有矩阵 matrix 如下:[ [1, 4, 7, 11, 15],[2, 5, 8, 12, 19],[3, 6, 9, 16, 22],[10, 13, 14, 17, 24],[18, 21, 23, 26, 30]]给定 target = 5,返回 true。给原创 2021-07-02 01:22:46 · 157 阅读 · 0 评论 -
剑指Offer 05. 替换空格
题目描述:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。示例1:输入:"We Are Happy"返回值:"We%20Are%20Happy"方法一:调包import java.util.*;public class Solution { public String replaceSpace (String s) { return s.replaceAll(原创 2021-07-05 22:15:27 · 119 阅读 · 0 评论 -
剑指Offer 29. 顺时针打印矩阵
题目描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例 2:输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]方法一:按顺时针的方向,从外到里打印矩阵的值。下图的矩阵打印结果为:1, 2, 3, 4, 8, 12, 16, 15, 1原创 2021-07-03 23:17:34 · 182 阅读 · 0 评论 -
剑指Offer 50. 第一个只出现一次的字符
题目一(字符串中第一个只出现一次的字符)描述:在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)示例1:输入:"google"返回值:4方法一:暴力解法先将字符串转换成字符数组,然后使用一个指针遍历字符数组,对于遍历的每一个字符,再使用一个指针,从该字符后面一个字符开始遍历,如果后面有同样的字符,说明该字符出现的次数不止一次,跳出循环。接着第一个指针后移一位,再按照上原创 2021-07-05 00:37:54 · 163 阅读 · 0 评论 -
剑指Offer 06. 从尾到头打印链表
题目描述:输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用集合返回)。示例:示例1:输入:{1,2,3}返回值:[3,2,1]示例2:输入:{67,0,24,58}返回值:[58,24,0,67]示例3:输入:{}返回值:[]方法一:使用栈一种最容易想到的思路是先反转链表,然后顺序打印反转后的链表。但是一般在面试中,尽量不要修改原始数据的结构。还有一种容易想到的是使用栈,先遍历链表,每遍历一个元素,将其保存在栈中,然后再依次弹出每一个元素,并保存在集合中,这时候集合原创 2021-07-07 01:47:36 · 118 阅读 · 0 评论 -
剑指Offer 22. 链表中倒数第k个节点
题目描述:输入一个链表,输出一个链表,该输出链表包含原链表中从倒数第k个结点至尾节点的全部节点。如果该链表长度小于k,请返回一个长度为 0 的链表。示例1:输入:{1,2,3,4,5},1 返回值:{5}方法一:遍历两次链表分析:易知链表的倒数第k个节点,就是链表的正数第 (n - k + 1)个节点,n为链表长度。所以先求链表长度为n,然后工作节点从pHead开始,向后移动 (n - k)次,就是倒数第k个节点。import java.util.*;public class Soluti原创 2021-07-06 23:12:46 · 120 阅读 · 0 评论 -
剑指Offer 23. 链表中环的入口节点
题目描述:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。输入说明:输入分为2段,第一段是入环前的链表部分,第二段是链表环的部分,后台将这2个会组装成一个有环或者无环单链表。示例1:输入:{1,2},{3,4,5}返回值:3说明:返回环形链表入口节点,我们后台会打印该环形链表入口节点,即3 示例2:输入:{1},{}返回值:"null"说明:没有环,返回null,后台打印"null" 示例3:输入:{},{2}返回值:2说明:只有环形链表节点2,原创 2021-07-03 23:21:08 · 134 阅读 · 2 评论 -
剑指Offer 24. 反转链表
题目描述:定义一个函数,输入一个链表的头节点,反转该链表,并输出反转后链表的头节点。示例:示例1:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL示例2:输入: NULL输出: NULL示例3:输入: 1->NULL输出: 1->NULL方法一:迭代(循环)class Solution { public ListNode reverseList(ListNo原创 2021-07-01 22:53:38 · 129 阅读 · 0 评论 -
剑指Offer 25. 合并两个排序的链表
题目描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。示例1:输入:{1,3,5},{2,4,6}返回值:{1,2,3,4,5,6}方法一:递归递归图解如下所示:public class Solution { public ListNode Merge(ListNode list1,ListNode list2) { if (list1 == null) { return list2;原创 2021-07-07 13:06:10 · 84 阅读 · 0 评论 -
剑指Offer 52. 两个链表的第一个公共节点
题目描述:输入两个链表,找出它们的第一个公共节点。如下面的两个链表:在节点 c1 开始相交。示例1:输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3输出:Reference of the node with value = 8输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5原创 2021-07-01 22:56:24 · 237 阅读 · 0 评论 -
剑指Offer 16. 数值的整数次方
题目:题目示例等详细描述请点击(此链接)[https://leetcode-cn.com/problems/shu-zhi-de-zheng-shu-ci-fang-lcof/]原创 2021-06-15 01:25:05 · 452 阅读 · 0 评论