
剑指Offer--Java
为了 我的百度啊 加油啊
不甘现状的咸鱼却没办法
缺少的是耐心 多出的是浮躁 刨根问底
展开
-
CCF 二十四点 Java
题目分析:首先想到用栈处理就已经成功一半了。可以定义两个栈,一个用来存放数字,一个用来存放“+”和“-”,当遇到“x”和“/”时,取出数字栈中栈顶元素与读取下一个数字进行 乘or除 操作,并将所得数字存到数字栈,其他的存放到符号栈。然后再定义两个栈,对以上两个栈元素进行颠倒,考虑(7-9-1-2)的情况。接下来直接进行操作就可以了。以上方法过于麻烦,开辟过空间。只开辟一个栈空间。遇到乘...原创 2020-03-12 00:26:58 · 279 阅读 · 0 评论 -
CCF 小明种苹果(续)Java
知识点回顾:Scanner和BufferedReaderBufferedReader相对于Scanner来说要快一点,因为Scanner对输入数据进行正则解析,而BufferedReader只是简单地读取字符序列。在Java SE6中我们可知道一个非常方便的输入数据的类Scanner,位于java.util包中,这个Scanner的具体用法为Scanner in = new Scanne...原创 2020-03-11 22:30:24 · 305 阅读 · 0 评论 -
CCF 俄罗斯方块 (JAVA)
题目分析:这题没有满分,90分,有一条样例没过,实在找不到了,就想到来博客分享一下思路,得到网友的点播.。现在满分了。接受数字的操作就不说了。首先是统计4*4矩阵的从下往上全是0的行的个数,这个决定了我接下来遍历15行的时候,遍历到哪里使得4*4矩阵里从下往上数第一个有1的行可以正好到达末尾。流程是从15*10矩阵往下遍历,如果在和4*4重合的位置中存在,两个都为...原创 2020-02-28 21:00:05 · 297 阅读 · 0 评论 -
CCF ISBN号码
题目分析:此题就是将前9个数字分别和1...9对应相乘,乘积和对11求模。其中结果是11,最后一位是X,不然为结果。import java.util.Scanner;public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanne...原创 2020-02-24 14:48:36 · 324 阅读 · 0 评论 -
CCF 2019-12 回收站选址
题目分析:题意还是挺好理解的。如果某点(有垃圾)的上、下、左和右都存在垃圾,则此点可以充当垃圾站。然后给此垃圾站评分,评分即为此垃圾站对角线含有垃圾的个数。根据上述题意解读,可以依次遍历每个点,检查其是否符合垃圾站的要求,若不符合,continue;若符合,则统计垃圾站的评分。Note:数据的规模为,因此可以使用双循环遍历。数据的大小为,即使用int型整数即可。import java...原创 2020-02-24 09:42:48 · 330 阅读 · 0 评论 -
ccf 公共钥匙盒 基于JAVA实现
import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;import java.util.Scanner;public class ccf_201709_2 { public static void main(String[] args) { Scanner scan...原创 2019-12-12 23:04:44 · 228 阅读 · 0 评论 -
构建乘积数组
题目:给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。思路:没有标红的话 -- B[i] = A[0]*A[1]*...*A[i-1]*A[i]*A[i+1]*...*A[n-1]/A[i]。...原创 2019-07-23 21:03:22 · 126 阅读 · 0 评论 -
数组中重复的数字
题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。思路:关键字已经标红了。定义一个长度相等的数组,对应的数字的个数存放在对应索引上。而后遍历新建数组,返回第一个个数大于1的索...原创 2019-07-23 20:35:06 · 171 阅读 · 0 评论 -
数字在排序数组中出现的次数
题目:统计一个数字在排序数组中出现的次数。思路:这个题目的提示点在 排序数组 这几个字上。找到就定义两个索引向两边统计;找不到就返回0。public static int GetNumberOfK(int [] array , int k) { int low = 0; int high = array.length; int mid = 0; ...原创 2019-07-23 20:17:58 · 97 阅读 · 0 评论 -
数组中只出现一次的数字
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。思路:定义两个索引i,j;i指向当前遍历的数字,j指向i次的搜索。若array[i] == array[j];就将j之后的数字向前移动。此时i遍历的最大值减 1。如果j遍历末尾仍然没有相同的,则将此数字保存。切记第二层循环的结束条件和外层循环一致。public class Solution ...原创 2019-07-22 23:28:02 · 105 阅读 · 0 评论 -
连续子数组的最大和
题目:HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和...原创 2019-07-18 21:05:34 · 100 阅读 · 0 评论 -
数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路:1、将所有的数字存放在字典中,并且统计其个数。同时定义两个变量分别保存个数最多的和其值。最后再判断一下。空间复杂度:O(n) 2...原创 2019-07-18 20:41:57 · 118 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路:1、从前向后依次遍历数组,碰到偶数,就将此索引之后的数字依次向前移动一位。注意:当前索引的数字已经更换了,所以索引要不变;因为索引保持不变了,但是从的索引数要减一(具体看代码实现吧!)。 2、...原创 2019-07-18 10:15:55 · 90 阅读 · 0 评论 -
旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路:希望看到的大神,请分享简单的思路吧!!!public int minNumberInRotateArr...原创 2019-07-17 21:22:01 · 84 阅读 · 0 评论 -
删除链表中重复的节点(重点)
题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5思路:遍历节点的同时判断当前节点与下一个节点是否相同,如果相同则删除。 删除方法 使用相同节点的前一个节点,使其指向相同节点的下一个节点。pPre:上一个不重复...原创 2019-07-17 21:09:27 · 146 阅读 · 0 评论 -
链表中环的入口结点
题目:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。思路:首先,判断链表是否有环,即采用两个快慢指针,若相遇,有环。不然直接返回null。然后,寻找入环结点。根据环中结点的个数,使快指针先走这个数,然后依次移动,最终的相遇点,即为入环结点。PS:关于求环中结点个数。前期快慢指针相遇后,证明有环。则定义一个计数器,保证一个结点不动,依次移动另一个,直到两个结点再次...原创 2019-07-17 10:04:45 · 87 阅读 · 0 评论 -
两个链表的第一个公共结点
题目:输入两个链表,找出它们的第一个公共结点。思路:1、我们可以把两个链表拼接起来,一个pHead1在前pHead2在后,一个pHead2在前pHead1在后。这样,生成了两个相同长度的链表,那么我们只要同时遍历这两个表,就一定能找到公共结点。 2、我们也可以先让把长的链表的头砍掉,让两个链表长度相同,这样,同时遍历也能找到公共结点。public clas...原创 2019-07-16 21:10:52 · 148 阅读 · 0 评论 -
复杂链表的复制
题目:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)思路:(来自于大神的思路,跪谢!!!)首先,在原链表的每个结点后面依次插入一个新建结点,此新建节点的label为原链表结点的对应值(完成next和label赋值);然后依次遍历...原创 2019-07-16 20:55:25 · 86 阅读 · 0 评论 -
合并两个排序的链表
题目:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。思路:1、先判断两个链表是否为空,一个为空,就直接返回另一个。然后定义两个不同节点,同时指向两个链表中最小值。保证一个头指针不动,另一个根据两链表最小值而动。直到一个链表为空,则直接将另一个链表接在后面。因为有一个静止头结点始终指向新建链表的头结点,返回它即可。 2、两个链...原创 2019-07-16 10:20:05 · 117 阅读 · 0 评论 -
反转链表
题目:输入一个链表,反转链表后,输出新链表的表头。思路:这个题目和 从尾到头打印链表,我的解法是一样的。大神思路:通常,这种情况下,我们不希望修改原链表的结构。返回一个反序的链表,这就是经典的“后进先出”,我们可以使用栈实现这种顺序。每经过一个结点的时候,把该结点放到一个栈中。当遍历完整个链表后,再从栈顶开始逐个输出结点的值,给一个新的链表结构,这样链表就实现了反转。public s...原创 2019-07-15 20:51:36 · 128 阅读 · 0 评论 -
链表中倒数第K个节点
题目:输入一个链表,输出该链表中倒数第k个结点。思路:1、我的蠢办法是 逆序然后输出第K个,但是在提交的时候发现通过不了,因为测试程序是直接输出之后的所有值。 2、定义两个指针,指向头结点。先固定一个指针,另一个指针遍历,直到第k个,此时两个指针相距(k-1)。然后两个指针同时遍历,直到快指针到末尾,此时二者相距(k-1)个。慢指针所指即为倒数第K个。(K==0、K...原创 2019-07-15 20:44:30 · 107 阅读 · 0 评论 -
从尾到头打印链表
题目:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。思路:我知道这个题目在大神看来很简单,但是咸鱼真的觉得很难。先定义新建head节点,存储链表头结点。然后在循环里,新建节点,存储当前链表节点的值。使新建节点的后继节点指向新建head节点,然后使新建节点赋给新建head节点。public static ArrayList<Integer> printList...原创 2019-07-13 20:50:05 · 84 阅读 · 0 评论 -
替换空格
题目:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。思路:1、利用String里面自带的replaceALl()函数实现替换。 2、实例化StringBuffer类,遍历str, 如果是空格就在实例化的类添加"%20", 否则直接添加当前元素。pub...原创 2019-07-13 19:51:04 · 100 阅读 · 0 评论 -
二维数组中的查找
题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路:每行从左往右递增;每列从上往下递增。此时左上角的值最小,右下角的值最大。此时可以从右上角开始,比target小,就往下走,大就往左走,相等就跳出循环。循环截止的条件是 走到左下角。即i(行)小...原创 2019-07-13 19:23:16 · 97 阅读 · 0 评论 -
数值的整数次方
题目:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。思路:就是直接暴力。情况需要分清楚。1):exponent > 0 exponent个base相乘就好了;2):exponent < 0 exponent个base相乘,然后被1.0整除;3)exponent = 0时,直接为1.0。publi...原创 2019-07-11 20:49:41 · 78 阅读 · 0 评论 -
二进制中 0的个数
题目:输入一个整数,输出该数二进制表示中0的个数。其中负数用补码表示。思路:二进制与1求&,即判断二进制最后一位是否为1,若为1,则跳过,否则计数器+1;然后整数右移一位,直到整数为0。这个思路还是挺好理解的,就是二进制依次右移,查看最后一位是否为0,是就+1,不然就跳过。int count_1_num = 0; while(num != 0) { if((num&...原创 2019-07-11 20:16:30 · 1326 阅读 · 0 评论 -
二进制中 1 的个数
题目:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路:本人的第一个想法就是 整数直接求二进制,然后统计1的个数;负数就直接求对应正数的二进制,在8位的基础上计算 除符号位外 其他位取反,而后二进制+1,最后统计1的个数。(是不是很繁琐)知识补充:在计算机中,负数是以补码存储的。负数的补码:计算对应整数的二进制,由于整数为8位,第一位为1 ,其余用0补齐8位。然后除第...原创 2019-07-11 20:02:06 · 139 阅读 · 0 评论