
数据结构算法题
fjswcjswzy
主要研究:图像处理、计算机视觉、模式识别
;我的邮箱:fjswcjswzy@126.com
;欢迎一起交流讨论,一起学习进步
展开
-
(java)顺时针打印矩阵:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1
文章目录题目描述大神分析大神代码题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.大神分析刷 LeetCode 看到的大神题解,感觉容易理解且好写简单来说,就是不断地收缩矩阵的边界定义四个变量代表范围,up、down、left、right向右走存入整行的值,当存入后原创 2020-10-08 09:45:11 · 389 阅读 · 0 评论 -
(java)最小的K个数:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。
文章目录题目描述我的分析我的代码大神分析大神代码题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。我的分析对数组进行排序,从小到大排序,最后输出前k个数就好,用了冒泡排序,时间复杂度太高了,并且没有什么思想,面试要是用我这种肯定被拒我的代码import java.util.ArrayList;public class Solution { public ArrayList<Integer> Ge原创 2020-10-07 20:37:07 · 505 阅读 · 0 评论 -
(java)机器人的运动范围:地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当
文章目录题目描述我的分析我的代码大神分析大神代码题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?我的分析【用例没通过,只是分享思路,希望大家一起交流】找规律:我们把方格看成是一个矩阵,矩阵最左下角原创 2020-10-05 12:02:55 · 720 阅读 · 0 评论 -
(java)数组模拟队列原理及代码
文章目录1 队列的特性2 数组模拟队列2.1示意图2.2 代码2.3 缺点及改进1 队列的特性队列是一个有序列表,可以用数组或链表实现先进先出:先存入队列的数据,要先取出。后存入的要后取出2 数组模拟队列2.1示意图初始时刻:有一个名为Queue的队列,有两个指针分别为rear和front,其中rear代表队列的尾部,front代表队列的头部,初始化他们都为-1(都为-1是因为队列的头一个位置是0,我们要指向0之前的位置,如果为0的话,那么就代表已经有数据了)添加数据:头部指针原创 2020-10-03 22:53:13 · 138 阅读 · 0 评论 -
(java)调整数组顺序使奇数位于偶数前面:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相
文章目录题目描述我的分析我的代码大神的分析大神的代码题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。我的分析从头到尾变量原数组,先找出奇数,依次添加到ArrayList中,再找偶数,再依次添加到ArrayList中,最后再将ArrayList内元素的值赋给原数组【很弱智的暴力解法,要是面试的时候肯定过不了,估计offer就没了】我的代码import java.util原创 2020-10-02 21:09:02 · 322 阅读 · 0 评论 -
(java)把数组排成最小的数:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321
文章目录题目描述题目分析代码题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。题目分析比较两个字符串s1, s2大小的时候,先将它们拼接起来,比较s1+s2,和s2+s1那个大,如果s1+s2大,那说明s2应该放前面,所以按这个规则,s2就应该排在s1前面代码public class Solution { public String PrintMinNu原创 2020-10-01 22:56:03 · 524 阅读 · 0 评论 -
(java)和为S的两个数字:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
文章目录题目描述分析代码题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。输出描述:对应每个测试案例,输出两个数,小的先输出。分析a+b=s,a和b越远乘积越小假设:若b>a,且存在,a + b = s;(a - m ) + (b + m) = s则:(a - m )(b + m)=ab - (b-a)m - m*m < ab;说明外层的乘积更小也就是说依然是左右夹逼法!!!只需要2个指原创 2020-09-29 20:58:17 · 261 阅读 · 0 评论 -
(java)数组中重复的数字:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。
文章目录题目描述题目分析解法一:排序解法二:哈希表题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。题目分析看到这个题目, 感觉很简单,但是再当我看到题目给出的传入参数的时候,我懵逼了,出的什么题,对java也太不友好了。直接搬答案。。https://blog.nowcode原创 2020-09-26 22:15:12 · 381 阅读 · 0 评论 -
(java)数字在排序数组中出现的次数:统计一个数字在升序数组中出现的次数
文章目录题目描述题目分析代码题目描述统计一个数字在升序数组中出现的次数。题目分析我设了两个指针,遍历数组,查找是否有与指定数字相等的元素;如果存在,则小指针记录下第一个等于k的索引值;大指针继续向下移动,寻找小指针之后第一个与k不相等的元素索引,记录下索引值,如果一相等的话,则大指针为数组的长度值;返回的是大指针减去小指针的值;代码/** * 统计一个数字在升序数组中出现的次数。 */public class Solution { public int GetNumberO原创 2020-09-24 10:59:48 · 353 阅读 · 0 评论 -
(java)构建乘积数组: 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...
文章目录题目描述题目分析代码题目描述给定一个数组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[0] = A[1] * A[2] * … * A[n-1],B[n-1] = A[0] * A[1] * … * A[n-2];)对于A长度为1的情况,B无意义,故而无法构建,因此该情况不会存在。题目分析构建两个辅助数组C和D来进行计算。C数组从左边开始,一直计算到1原创 2020-09-15 10:16:25 · 332 阅读 · 0 评论 -
(java)稀疏数组的原理及代码实现
文章目录问题引入稀疏数组的基本介绍二维数组与稀疏数组转换的思路代码实现问题引入在我们编写五子棋的程序中,需要储存当前盘面和继续上盘的功能因为二维数组的很多值是默认值0,因此记录了很多没有意义的数据,这时候就需要稀疏数组了稀疏数组的基本介绍当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组稀疏数组的处理方法:①记录数组一共有几行几列,有多少个不同的值 ②把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模第0行代表着原数的二维数值一共6行原创 2020-09-11 16:47:24 · 160 阅读 · 0 评论 -
线性结构和非线性结构的区别
一、线性结构线性结构最典型的数据关系就是一对一,它是一种有序数据的集合,什么叫有序呢?比如说一维数组,决定数组块中的数据元素只有一个因素,也就是从左往右或者从右往左的行因素,而不是像二维和多维数组受行和列及更多因素影响,这就是一对一的关系。线性结构,除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。常用的线性结构有:线性表,栈,队列,双队列,数组,串。特点:1.集合中必存在唯一的一个"第一个元素";2.集合中必存在唯一的一个"最后的元素";3.除最后元素之外,其它数据元素均有唯一的原创 2020-09-11 11:33:14 · 8481 阅读 · 0 评论 -
(java)和为S的连续正数序列:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少
文章目录题目描述分析代码题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!输出描述:输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序分析用滑动窗口:假设输原创 2020-08-19 11:03:11 · 312 阅读 · 0 评论 -
(java)剪绳子:给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],...,k[m]。请问k[1]x...xk[m]可能的最
文章目录题目描述分析:代码大神解法题目描述给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],…,k[m]。请问k[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。分析:target=2, 最优解:1 1target=3, 最优解:2 1target=4, 最优解:2 2target=5, 最优解:3 2target=原创 2020-08-16 11:39:55 · 1155 阅读 · 0 评论 -
(java)数组中出现次数超过一半的数字:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,
文章目录题目描述分析代码题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。分析摘抄于:https://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163?tpId=13&&tqId=11181&rp=1&ru=/ta/coding-in原创 2020-08-14 17:34:36 · 597 阅读 · 0 评论 -
(java)连续子数组的最大和:给一个数组,返回它的最大连续子序列的和
文章目录题目描述分析代码题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)分析动态规划,dp[i]就是以原创 2020-08-14 11:46:42 · 326 阅读 · 0 评论 -
(java)变态跳台阶:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
文章目录题目描述分析代码题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。分析易知 f(n)=f(n-1)+f(n-2)+……f(1)f(n-1)=f(n-2)+……f(1)两式相减得f(n)=2f(n-1)很明显,就是公比为2的等比数列,那么跳上n级台阶的跳法就为:2^(n-1)代码public class Solution { public int JumpFloorII(int target) {原创 2020-08-13 16:48:40 · 329 阅读 · 0 评论 -
(java)斐波那契数列:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。 n<=39
文章目录题目描述代码题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。n<=39代码public class Solution { public int Fibonacci(int n) { if (n==0){ return 0; } int l = 1; int m = 1; for (int i =原创 2020-08-13 14:45:33 · 429 阅读 · 0 评论 -
(java)矩形覆盖:我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
文章目录题目描述分析代码题目描述我们可以用2x1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2x1的小矩形无重叠地覆盖一个2xn的大矩形,总共有多少种方法?比如n=3时,2x3的矩形块有3种覆盖方法:分析假设我们可以用如下图所示2x1的小矩形横着或者竖着去覆盖更大的矩形,请问用8个2x1的小矩形去无重复的覆盖一个2x8的大矩形。总共有多少种方法。把覆盖2x8矩形的覆盖方法总数记为f(8).用第一个矩形去覆盖大矩形时,有两种选择,横放或者竖放。竖放时,右边有2x7的区域尚未被覆盖,那么剩原创 2020-08-13 14:20:13 · 1104 阅读 · 0 评论 -
(java)跳台阶:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
文章目录题目描述思路解法一:递归暴力破解解法二:题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。思路解法一:递归暴力破解public class Solution { public int JumpFloor(int target) { if (target==1){ return 1; } else if (target==2){原创 2020-08-13 12:08:43 · 1453 阅读 · 0 评论 -
(java)二维数组中的查找:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断
文章目录题目描述解法一:暴力解法解法二:找左下角元素题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解法一:暴力解法遍历二维数组每个元素,一个个进行比较public class Solution { public boolean Find(int target, int [][] array) { boolean flag原创 2020-08-12 17:33:17 · 276 阅读 · 0 评论 -
(java)旋转数组的最小数字:输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
文章目录题目描述思路代码题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路这题是用二分法,二分法的变种形式,没有具体的值用来比较。那么用中间值和高低位进行比较,看处于递增还是递减序列,进行操作缩小范围。处于递增:low上移处于递减:high下移(如果原创 2020-08-12 14:46:21 · 319 阅读 · 0 评论 -
(java)整数中1出现的次数(从1到n整数中1出现的次数)
文章目录题目描述我的思路我的代码大神解法题目描述求出1~13的整数中1出现的次 数,并算出100~ 1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。我的思路遍历一个一个数,把数转成字符串,然后判断是否等于1(我也太菜了)我的代码public class Solution {原创 2020-08-12 10:31:34 · 190 阅读 · 0 评论 -
(java)二进制中1的个数:输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。
二进制中1的个数题目:输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。自己的解法:先把十进制数换成2进制,再把其送到数组中,遍历其每个元素,看等于1 的元素有多少个public class Solution { public int NumberOf1(int n) { String Bi = Integer.toBinaryString(n); String[] StrBi = Bi.split(""); int a原创 2020-07-15 20:57:24 · 1220 阅读 · 0 评论 -
(java)求1+2+3+...+n:不使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句
求1+2+3+…+n题目:求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。思路:刚拿到这题,感觉好难,什么方法都不能用,不过仔细想了想,也找到了切入口,首先得知这题是要用到递归的,但是不能用if,while,for等,那要怎么做才能递归呢?-----短路定理逻辑运算符“&&”和“||”都具有短路特性。逻辑与的短路特性a&&b 只有a为真时,才需要判断b的值,如果a为假时,原创 2020-07-14 21:08:24 · 528 阅读 · 0 评论 -
(java)不用加减乘除做加法:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号
1、不用加减乘除做加法题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号思路:不用加减乘除做加法,也只能用位运算和与或非异或之类的了首先得知道在二进制中,是如何相加、进位的。可以看出,没有采取进位操作导致运算错误,那么如何解决进位问题呢?在位运算中,我们用“<<”表示向左移动一位,也就是“进位”。那么我们就可以得到如下的表达式:( x & y ) << 1那么,我们就拥有了两个基本表达式:执行加法 x ^ y进位操作 (原创 2020-07-14 21:06:07 · 811 阅读 · 0 评论