08 2020 档案
摘要:题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。 思路 对数字做运算,除四则运算之外,只剩下位运算了。 1)不考虑进位对每一位相加:1加0,0加1都等于1,而0加0,1加1等于0,所以使用异或^操作; 2)计算进位:只有1加1产生进位,所以采用位与&操作,再左
阅读全文
摘要:题目描述 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。 思路 当n大于1时,和为f(n)=f(n-1)+n,n=1时,f(n)=1 使用递归代替循环,用逻辑运算符&&或者||来代替判断语句。 知识点:逻
阅读全文
摘要:题目描述 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任
阅读全文
摘要:题目描述 LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子..
阅读全文
摘要:题目描述 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。 思路 思路1:考察字符串翻转。该题需要两次翻转,以输入字符串"I am a student
阅读全文
摘要:题目描述 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
阅读全文
摘要:题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 输出描述: 对应每个测试案例,输出两个数,小的先输出。 思路 双指针。本题的关键是数组是递增排序的。那么我们可以定义两个指针,初始化第一个指针指向数组中第一个(
阅读全文
摘要:题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快
阅读全文
摘要:题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。 思路 根据题意,如果要求空间复杂度为O(1),则不能使用哈希表了。这道题考察的是位运算。 Tips:如果数组中只有一个数字只出现一次,从头到尾 异或
阅读全文
摘要:题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树。 在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树 思路 平衡二叉树:每个节点左右子树高度相差不超过1。 思路1:最直接的做法,遍历每个结点,借助一个获取树深度的递归函数,根据该结点的左右子树高度差判断是否平衡,然后递归地对左右子树
阅读全文
摘要:题目描述 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 思路 思路1:采用递归实现。树的深度=max(左子树深度,右子树深度)+1。 思路2:层序遍历。 解法1 /** public class TreeNode { int
阅读全文
摘要:题目描述 统计一个数字在升序数组中出现的次数。 思路 考察的是二分查找,最优解时间复杂度为O(logn)。 二分的前提:有序(一提到有序,必须立马想到二分!) 思路1:先用二分查找找到指定的数字,如果存在,再在两侧顺序扫描第一个和最后一个。因为要查找的数字可能出现n次,所以时间复杂度为O(n)。因此
阅读全文
摘要:题目描述 输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的) 思路 如果两个链表有公共结点,那么两个链表用公共的尾部,如果从两个链表的尾部开始往前比较,那么最后一个相同的节点就是我们要找的节点。 思路1:利用两个辅助栈。
阅读全文
摘要:题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007 思路 如果数组中的元素是有序的(单调递增的),则不会有逆序对了。其他情况比如无序或者单
阅读全文
摘要:题目描述 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数) 思路 创建哈希表,键值key为字符,值value为出现次数。第一遍扫描:对每个扫描到的字符的次数加一;第二遍扫描:对每个扫
阅读全文
摘要:题目描述 把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。 思路 思路1:逐个判断每个整数是不是丑数。 所谓一个数m是另一个数n的因子,是指n能被m整除,也就是n%m
阅读全文
摘要:题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。 思路 思路1:求数组中所有数字的全排列,类似于“字符串的排列”,然后把每个排列拼起来,求最小值。 (时间复杂度很
阅读全文
摘要:题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到
阅读全文
摘要:题目描述 输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整/数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。 例如,输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},因此输出为该子数组的和18。 思路 涉及的知识
阅读全文
摘要:题目描述 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。 思路 思路1:利用排序。排序后最前面的K个数就是最小的K个数。 (时间复杂度O(nlogn)) 思路2:快排Partition思想(Partition函数既是快排的基础
阅读全文
摘要:题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 思路 思路1:利用排序。对数组排序后,如果符合条件的数存在,则一定是数组中间的
阅读全文
摘要:题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 输入描述: 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。 思路 求整个字符串的排
阅读全文
摘要:题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 思路 题目要求转换成排序后的双向链表,根据二叉搜索树的性质,值的大小:左子树<根节点<右子树。因此遍历方式为 中序遍历,中序遍历有 递归实现 和 非递归实现。 思路1:中序遍
阅读全文
摘要:题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) 思路 思路1:先复制结点,用next链接,最后根据原始
阅读全文
摘要:题目描述 输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。 思路 这道题相当于树的DFS。 1. 遍历方式(根据根节点的位置):由于路径是从根节点出发到叶节点,因此我们首先需要遍历根节点。在树
阅读全文
摘要:题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。例如{5,76,9,11,10,8}返回true;而{7,4,6,5}返回false。 思路 二叉搜索树:树中没有值相同的两个节点,对于每一个节点,它左
阅读全文
摘要:主要内容: 不分行从上到下打印二叉树 分行从上到下打印二叉树 分行从下到上打印二叉树 之字形打印二叉树 二叉树的右视图 1. 不分行从上到下打印二叉树 题目描述:从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。 相关题目:剑指22;剑指18; 代码实现: import java.
阅读全文
摘要:题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印。 思路 考的是二叉树的 层序遍历 。从下图可以看出,每次打印一个节点的时候,如果该节点有子节点,则把该节点的子节点放到一个队列的尾部。接下来到对队列的头部取出最早进入队列的节点放到ArrayList 中,重复前面的操作,直至队列中所有的
阅读全文
摘要:题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长
阅读全文
摘要:题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。 思路 要求实现一个O(1)时间复杂度的返回最小值的栈。正常情况下,栈的push,pop操作都为O(1),但是返回最小值,需要遍历整个栈,时间复杂度为O(n),所以这里需要 空间换时间 的
阅读全文
摘要:题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 思路 这道题没有很
阅读全文
摘要:题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。 思路 先 前序或层序遍历 这棵树的每个节点,如果遍历到的节点有子节点,就交换它的两个子节点。当交换完所有非叶节点的左右节点之后,就得到了树的镜像。 既然是二叉树的遍历,那么就有 递归实现 和 非递归实现 两个版本 ~ 解法1(递归实现) /**
阅读全文
摘要:题目描述 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) 分析 若树B是树A的子结构,则子结构的根节点可能为树A的任意一个节点。因此,需要完成以下两步操作: 第一步:在树A中找到和树B的根节点的值一样的节点 R (也就是树A的遍历); 第二步:判断树A中以
阅读全文
摘要:题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 思路 可以使用递归实现,也可以用非递归。 注意:需要考虑到很多很多特殊情况!!如边界条件;链表中的值有相同的情况;某一个链表中连续几个值都比另一个链表的当前值小(大)。 解法1(递归)思路:当得到
阅读全文
摘要:题目描述 输入一个链表,反转链表后,输出新链表的表头。 思路 为了反转一个链表,需要调整链表中指针的方向。当调整节点 i 的指针指向时,需要知道节点 i 本身,还需要知道 i 的前一个节点 h,因为我们需要把节点 i 的指针指向节点 h 。同时,我们还需要提前保存 i 原来的下一个节点 j ,以防止
阅读全文
摘要:题目描述 输入一个链表,输出该链表中倒数第k个结点。 分析 思路1:遍历链表两次,第一次统计出链表节点的个数n,第二次再从前往后找到第n-k+1个节点,即为所求。 思路2:只需要遍历链表一次。定义两个指针(快指针和慢指针),先让快、慢指针都指向头节点,然后让快指针向前走k-1步,指向第k个结点;接着
阅读全文
摘要:题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 分析 注意题中要求“相对位置不变”,即保持稳定性。 方法1:最简单的思路是开辟额外数组,遍历一次数组,遇到奇数直接放入新
阅读全文
摘要:题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 保证base和exponent不同时为0 分析 看似简单,需要注意的小细节比较多!!首先要充分考虑好边界条件,还要考虑到如果指数exponent为负数的情况。 解法1(传统解法,
阅读全文
摘要:题目描述 输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。 分析 考察位运算。 如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影
阅读全文
摘要:题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 分析 用2*1的小矩形覆盖大矩形最左边时有两种选择,竖着放或者横着放。当竖着放时,右边还剩下2*n-1的区域,覆盖方法记为f(n-1); 考虑横着放的情况,当2
阅读全文
摘要:题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 分析 【分析1】如果上一步跳 1 步到达第 n 个台阶,说明上一步在第 n-1 个台阶。已知跳到第n-1个台阶的方法数为f[n-1] 如果上一步跳 2 步到达第 n 个台阶,说明
阅读全文
摘要:题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。 分析 对于第n个台阶来说,只能从n-1或者n-2的台阶跳上来,所以F(n) = F(n-1) + F(n-2)。 因此,本题实际就是斐波那契数列的应用。 代码实现1 参考
阅读全文
摘要:题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 案例 {3 4
阅读全文
摘要:题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 思路 栈的特点是“先进后出”,队列是“先进先出”。 每次插入元素,压入stack1。当stack2为空时,把stack1中的元素逐个弹出并压入stack2。由于先进入队列的元素被压到stack1的底端,经
阅读全文
摘要:题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 考点 考察对二叉树遍历方式的理解,以及如何把构建二叉
阅读全文
摘要:题目描述 输入一个链表,按链表从尾到头的顺序返回一个ArrayList。 思路 方法一:借助栈的“后进先出”实现。从头到尾遍历链表,每经过一个节点,就把节点压入栈中。遍历完后,再从栈顶逐个输出节点的值。 方法二:用递归实现(递归的本质就是一个栈结构)。每访问到一个节点的时候,先递归输出它后面的节点,
阅读全文
摘要:题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 思路: 解法一:调用自带函数str.toString().replace(" ","%20")。 解法二:在当前字符串上进行替换。
阅读全文
摘要:题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 案例 输入:7,返回true ; 输入5, 返回false 方法1:暴力法 public cla
阅读全文

浙公网安备 33010602011771号