基础算法
百晓生612
这个作者很懒,什么都没留下…
展开
-
四平方和-蓝桥杯
第七届蓝桥杯 (javaB组)四平方和四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多4个正整数的平方和。如果把0包括进去,就正好可以表示为4个数的平方和。比如:5 = 0^2 + 0^2 + 1^2 + 2^27 = 1^2 + 1^2 + 1^2 + 2^2(^符号表示乘方的意思)对于一个给定的正整数,可能存在多种平方和的表示法。要求你对4个数排序:0 <= a <= b <= c <= d并对所有的可能表示法按 a,b,c,d 为联合主键升序排原创 2022-04-07 11:22:25 · 99 阅读 · 0 评论 -
数字游戏-蓝桥杯
问题描述 给定一个1~N的排列a[i],每次将相邻两个数相加,得到新序列,再对新序列重复这样的操作,显然每次得到的序列都比上一次的序列长度少1,最终只剩一个数字。 例如: 3 1 2 4 4 3 6 7 9 16 现在如果知道N和最后得到的数字sum,请求出最初序列a[i],为1~N的一个排列。若有多种答案,则输出字典序最小的那一个。数据保证有解。输入格式 第1行为两个正整数n,sum输出格式 一个1~N的一个排列样...原创 2022-04-07 09:49:28 · 758 阅读 · 0 评论 -
奇怪的分式
上小学的时候,小明经常自己发明新算法。一次,老师出的题目是: 1/4 乘以 8/5 小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1.png) 老师刚想批评他,转念一想,这个答案凑巧也对啊,真是见鬼! 对于分子、分母都是 1~9 中的一位数的情况,还有哪些算式可以这样计算呢? 请写出所有不同算式的个数(包括题中举例的)。 显然,交换分子分母后,例如:4/1 乘以 5/8 是满足要求的,这算做不同的算式。 但对于分子...原创 2022-04-05 11:44:34 · 67 阅读 · 0 评论 -
扑克牌序列-蓝桥杯
A A 2 2 3 3 4 4, 一共4对扑克牌。请你把它们排成一行。要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌。请填写出所有符合要求的排列中,字典序最小的那个。例如:22AA3344 比 A2A23344 字典序小。当然,它们都不是满足要求的答案。请通过浏览器提交答案。“A”一定不要用小写字母a,也不要用“1”代替。字符间一定不要留空格。public class 扑克牌 { public static void main(String.原创 2022-04-05 10:15:39 · 174 阅读 · 0 评论 -
连号区间数
问题描述小明这些天一直在思考这样一个奇怪而有趣的问题:在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是:如果区间[L, R] 里的所有元素(即此排列的第L个到第R个元素)递增排序后能得到一个长度为R-L+1的“连续”数列,则称这个区间连号区间。当N很小的时候,小明可以很快地算出答案,但是当N变大的时候,问题就不是那么简单了,现在小明需要你的帮助。输入格式第一行是一个正整数N (1 <= N <= 50000), 表示全排列的规模。第二行是N个不同的数原创 2022-04-04 21:34:35 · 115 阅读 · 0 评论 -
立方变自身-蓝桥杯
它的最大边界不可能超过99,找出数组的边界这个问题就解决了public class 立方变自身 { public static void main(String[] args) { // TODO Auto-generated method stub for(int i=1;i<99;i++) { int count=0; int num=i*i*i; int n = num%10; while(原创 2022-04-04 20:13:30 · 92 阅读 · 0 评论 -
将数组的行和列清零
public static void main(String[] args) { // TODO Auto-generated method stub int[][] arr= {{1,2,3,4},{5,6,0,8},{9,0,11,12},{13,14,15,16}}; int[] row=new int[arr.length]; int[] cow=new int[arr[0].length]; for(int i=0;i<..原创 2022-04-04 12:13:28 · 261 阅读 · 0 评论 -
顺时针打印二维数组
描述:1 2 3 45 6 7 89 10 11 12结果1 2 3 4 8 12 11 10 9 5 6 7话不多说,直接上代码 public static void main(String[] args) { int[][] arr = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 }, { 13, 14, 15, 16 } }; System.out.println(f(arr)); } p原创 2022-04-04 11:45:44 · 94 阅读 · 0 评论 -
两个字符串判断是否相同
public static void main(String[] args) { // TODO Auto-generated method stub Scanner scan=new Scanner(System.in); String s1=scan.next(); String s2=scan.next(); if(check(s1,s2)) { System.out.println("相同"); } else .原创 2022-04-04 09:42:39 · 410 阅读 · 0 评论 -
带分数-蓝桥杯
问题描述100 可以表示为带分数的形式:100 = 3 + 69258 / 714。还可以表示为:100 = 82 + 3546 / 197。注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。类似这样的带分数,100 有 11 种表示法。输入格式从标准输入读入一个正整数N (N<1000*1000)输出格式程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。注意:不要求输出每个表示,只统计有多少表示法!样例输入1100样例输出原创 2022-04-02 20:53:35 · 107 阅读 · 0 评论 -
JAVA全排列代码
递归对一个数组全片列public static void main(String[] args) { // TODO Auto-generated method stub int[] arr= {1,2,3}; f(arr,0); } public static void f(int[] arr,int k) { if(k==arr.length) { println(arr); } for(int i=k;i<arr.length;i++)原创 2022-04-02 20:05:55 · 510 阅读 · 0 评论 -
所有员工的年龄排序
题目:公司现在要对几万员工的年龄进行排序,因为公式员工的人数非常多,所以要求排序算法的效率要非常高,你能写出这样的程序吗?输入:输入可能包含多个测试样例,对于每个测试案输出: 对应每个测试案例请输出排序后的n个员工的年龄,每个年龄后面有一个空格。如果使用基本的排序算法,时间复杂度非常大,又因为年龄数值跨度不大,所以使用基数排序。public static void main(String[] args) { // TODO Auto-generated method stub原创 2022-04-02 13:28:26 · 510 阅读 · 0 评论 -
前K个数.
逆序排列前K个数,因为数据量太大,不能全部存储再内存中,只能一个一个地从磁盘或者网络上读取数据,设计一个高效地算法来解决这个问题。不限制用户输入数据的个数,用户每输入一个数据就回车,使得程序可以立即获取这个数据,用户输入-1代表终止。然后用户输入K,代表要求得到的TOPK...原创 2022-04-02 12:35:20 · 103 阅读 · 0 评论 -
需要排序的子数组
给定一个无序数组arr,求出需要排序的最短子数组长度思路:找波峰public static void main(String[] args) { // TODO Auto-generated method stub int[] arr= {1,2,3,7,8,4,5,6}; find(arr,arr.length); } public static void find(int[] arr,int n) { int p1=...原创 2022-04-02 10:01:24 · 75 阅读 · 0 评论 -
试题 基础练习 01字串
问题描述对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:0000000001000100001100100请按从小到大的顺序输出这32种01串。输入格式本试题没有输入。输出格式输出32行,按从小到大的顺序每行一个长度为5的01串。样例输出00000000010001000011public static void main(String[] args) { // TODO Auto-generated.原创 2022-04-01 12:45:52 · 89 阅读 · 0 评论 -
桶排序..
设置桶,通过某种计算,将数组中的元素分配到各个桶中,再从桶中取出来,就可以求出来有序数组。一个桶里可以有多个数字,但是再桶里也会有一定的顺序时间复杂度:O(n)-O(nlogn)方法如下:基数排序:基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (n原创 2022-04-01 12:23:47 · 62 阅读 · 0 评论 -
计数排序·
如果原始数据范围不是很大,就可以使用计数排序方法:先求最大值,开辟辅助空间,开始扫描优点:快速 简便缺点:造成空间上的浪费public static void Countsort(int[] source) { int[] helper=new int[max(source)+1]; for(int e:source) { helper[e]++; } int k=0; for(int i=1;i<helper.length;i++) { w原创 2022-04-01 10:23:53 · 57 阅读 · 0 评论 -
树和二叉树
1.在算法中可以用数组来表示一棵树2.在树中主要用到的方法是递归。3.二叉树只有两个树枝。发展成左子树和右子树。4.原创 2022-04-01 09:33:08 · 859 阅读 · 0 评论 -
蓝桥杯-字母图形
问题描述利用字母可以组成一些美丽的图形,下面给出了一个例子:ABCDEFGBABCDEFCBABCDEDCBABCDEDCBABC这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。输入格式输入一行,包含两个整数n和m,分别表示你要输出的图形的行数的列数。输出格式输出n行,每个m个字符,为你的图形。样例输入5 7样例输出ABCDEFGBABCDEFCBABCDEDCBABCDEDCBABCpublic static void ma原创 2022-04-01 08:41:23 · 82 阅读 · 0 评论 -
求逆序对问题
1.暴力破解法public static void main(String[] args) { // TODO Auto-generated method stub int [] arr= {2,1,5,6,2,3,4}; f(arr); } public static void f(int[] arr) { for(int i=0;i<arr.length;i++) { for(int j=i+1;j<arr.length;j++) {原创 2022-03-31 11:08:08 · 220 阅读 · 0 评论 -
合并有序数组
核心思想:归并排序一般做法:将两个数组合并,在按照一般排序的排序方法(如:冒泡排序)进行排序。常用做法:将因为数组都是有序的,将第二个数组从倒数第一个数与第一个数组的最后一个数开始比较,按照大小插入。两个数组的指针各自移动。 public static void main(String[] args) { int[] a = {0, 3, 4, 6, 9, 12}; int[] b = {1, 2, 5, 7, 8, 10, 11};原创 2022-03-31 09:40:01 · 1351 阅读 · 0 评论 -
最小可用id
题目:再非负数组乱序中找到最小可用id这个问题的解法有很多,暴力破解 辅助空间等等,其中利用辅助数组进行求解,是一种性价比比较高的解法。public static void main(String[] args) { // TODO Auto-generated method stub int[] arr= {3,4,6,1,2}; int k=f(arr); System.out.println(k); } public static int f原创 2022-03-28 11:36:30 · 81 阅读 · 0 评论 -
设计一个快速高效的a的n次幂的算法
a的n次幂我们一般采用的是循环求出结果,那么他的时间复杂度就是O(n)这样就不是高效的,在我们解题的时候,往往会因为时间不通过。在时间复杂度是O(n)的时候,降低时间复杂度,往往是往log的方向降低public static void main(String[] args) { Scanner scan=new Scanner(System.in); int a=scan.nextInt(); int n=scan.nextInt(); int num=pow0(a,n);原创 2022-03-27 09:50:10 · 466 阅读 · 0 评论 -
最长递增子序列
列如:(1,9,2,5,6,7,3,4,6,8,0)中最长的子序列为93,4,6,8)核心思想:它是排序的变体排序的方法:冒泡排序 希尔排序 二分查找等等一般常用的是冒泡排序控制快慢双指针原创 2022-03-27 09:17:34 · 64 阅读 · 0 评论 -
在有空字符串的有序字符串数组中查找
关键:字符串的比较使用compareTo的方法使用方法:1.返回参与比较的前后两个字符串的ASCII码的差值,如果两个字符串首字母不同,则该方法返回首字母的ASCII码的差值。2.参与比较的两个字符串如果首字符相同,则比较下一个字符,直到有不同的为止,返回该不同的字符的asc码差值。3.返回为正数表示a1>a2, 返回为负数表示a1<a2, 返回为0表示a1==a2。public class Kongzifuchaun { public static void main.原创 2022-03-26 09:38:18 · 72 阅读 · 0 评论 -
小红上楼梯
小白上楼梯核心思想:递归import java.util.Scanner;public class Shanglouti { public static void main(String[] args) { // TODO Auto-generated method stub Scanner scan=new Scanner(System.in); int n=scan.nextInt(); int num=f(n); System.原创 2022-03-26 09:12:41 · 307 阅读 · 0 评论 -
旋转数组找出最小值-java
旋转数组找出最小值-java思路:变化的二分查找,核心思路是二分查找public static int f(int[] arr) { int start=0; int end=arr.length-1; if(arr[start]<=arr[end]) { return arr[start]; } while(end>start+1) { int mid=(start+end)/2;原创 2022-03-26 09:01:40 · 769 阅读 · 0 评论