数据结构与算法
1
Rose_Zhang25
这个作者很懒,什么都没留下…
展开
-
力扣:150. 逆波兰表达式求值
此代码为后缀表达式的计算 力扣:150. 逆波兰表达式求值原创 2022-06-17 21:49:11 · 161 阅读 · 3 评论 -
力扣 20. 有效的括号
此代码为 栈在括号匹配中的应用 顺序存储实现原创 2022-06-17 21:48:12 · 152 阅读 · 0 评论 -
带头结点栈的链式存储实现
带头结点栈的链式存储实现原创 2022-06-17 21:44:28 · 170 阅读 · 0 评论 -
栈的顺序存储实现
栈的顺序存储实现原创 2022-06-13 12:53:56 · 197 阅读 · 0 评论 -
带头结点双链表的基本操作的具体实现
双链表的基本操作具体实现原创 2022-06-12 22:28:55 · 168 阅读 · 0 评论 -
带头结点的单链表的基本操作
带头结点单链表基本操作的实现原创 2022-06-12 22:26:51 · 295 阅读 · 0 评论 -
线性表的顺序存储——顺序表的动态实现
顺序表的动态实现原创 2022-06-12 22:23:47 · 86 阅读 · 0 评论 -
线性表的顺序存储——顺序表的静态实现
线性表的简单实现原创 2022-06-12 22:21:54 · 80 阅读 · 0 评论 -
01背包——dp解法
/*有n个重量和价值分别为wi,vi的物品,从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中价值总和的最大值。1≤n≤1001≤wi,vi≤1001≤W≤10000输入:n=4(w,v)={(2,3),(1,2),(3,4),(2,2)}W=5输出:7(选择第0,1,3号物品)因为对每个物品只有选和不选两种情况,所以这个问题称为01背包。*/题解如图:public class problem_0_1背包问题 { public static vo原创 2022-04-06 15:48:12 · 705 阅读 · 0 评论 -
部分背包问题——贪心
/**有n个物体,第i个物体的重量为wi,价值为vi。在总重量不超过C的情况下让总价值尽量高。每一个物体都可以只取走一部分,价值和重量按比例计算。求最大总价值注意:每个物体可以只拿一部分,因此一定可以让总重量恰好为C。*/题解:本题通过贪心思想解题,尽可能拿价值高的物品,这样放入背包的价值才最大,但是对价值排序后会使得原来每种物品的重量和价值的对应关系丢失,我们引入物品类,使得每种物品的重量和价值捆绑在一起。最后通过物品类实现Comparable接口,按照价值和重量比排序,最后再从物品数组,从原创 2022-04-05 15:23:00 · 778 阅读 · 0 评论 -
力扣 1561. 你可以获得的最大硬币数目——贪心
题解:贪心算法解题,因为自己每次都是要第二多的,所以每次都要让Alice拿最多,Bob拿最少,这样自己拿的才最多。如果按照每次自己拿第二多,Bob拿第三多,自己可能会拿的更少,因为第二轮自己拿的就是第5多,而不让Bob拿第三多,自己第二轮就拿的就是第三多。言简意赅就是 撑死Alice,饿死Bobstatic int maxCoins(int[] piles) { int s=0; int len= piles.length; Arrays.sort..原创 2022-04-04 15:19:24 · 108 阅读 · 0 评论 -
力扣 LCP 06. 拿硬币——递归+贪心思想
题解:此题应用 递归+贪心思想解题,先拿一堆,一次先拿两枚硬币再拿一枚硬币,拿完一堆再拿下一堆,直到所有硬币堆拿完class Solution { public int minCount(int[] coins) { ArrayList<Integer> res=new ArrayList<>(); //创建用于统计结果的集合 minCountCore(coins,0,res); //dfs求解,从第0堆硬币开始拿 ..原创 2022-04-04 13:47:48 · 430 阅读 · 0 评论 -
剑指 Offer 06. 从尾到头打印链表
解题思路:先将链表翻转,以及统计结点个数,最后再从尾部往前遍历class Solution { public int[] reversePrint(ListNode head) { ListNode pre=null; ListNode cur=head; int count=0; //记录结点个数 //先翻转链表,统计结点..原创 2022-04-03 21:01:38 · 266 阅读 · 0 评论 -
素数环——dfs解法
/**输入正整数n,对1-n进行排列,使得相邻两个数之和均为素数,输出时从整数1开始,逆时针排列。同一个环应恰好输出一次。n<=16如输入:6输出:1 4 3 2 5 61 6 5 2 3 4*/题解:递归+深搜+回溯思想 解题 ,相当于全排列,枚举所有的可能,再最后处理环的问题public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n=原创 2022-04-03 18:44:23 · 316 阅读 · 0 评论 -
力扣52. N皇后 II ——递归回溯法求解
题解:通过递归回溯思想求解,尝试在棋盘上放皇后,判断尝试将皇后在棋盘上是否会冲突,皇后放置完毕则统计结果。 解题思路就是 通过4x4棋盘放置4皇后推广到nxn 放置n 皇后private static int count=0; public int totalNQueens(int n) { int[][] board=new int[n][n]; //创建棋盘 boolean[][] used=new boolean[n][n]; /..原创 2022-04-03 15:58:40 · 265 阅读 · 0 评论 -
面试题 08.07. 无重复字符串的排列组合
题解:利用dfs深度优先+递归回溯思想,以及开辟一个栈来临时保存当前遍历的情况,以此解题 import java.util.ArrayDeque;import java.util.ArrayList;import java.util.Deque;import java.util.ListIterator;public class test5 { public static void main(String[] args) { String s="qwe"; ..原创 2022-04-03 09:21:28 · 87 阅读 · 0 评论 -
力扣 1832. 判断句子是否为全字母句
题解:a-z的ASCILL码为97-122,利用ASCILL码解题,将字符的整型ASCILL码作为数组的下标,如该字符出现,则将其下标对应值加1,最后遍历辅助数组, public boolean checkIfPangram(String sentence) { int[] chs=new int[256]; //创建辅助数组,下标作为ASCILL码 char[] chars = sentence.toCharArray(); //将字符串转化为数组 ..原创 2022-04-02 23:39:16 · 68 阅读 · 0 评论 -
力扣46. 全排列
import java.util.ArrayDeque;import java.util.ArrayList;import java.util.Deque;import java.util.List;public class Solution { public static void main(String[] args) { int[] a={1,2,3}; List<List<Integer>> permute = permute.原创 2022-04-02 22:55:06 · 237 阅读 · 0 评论 -
力扣187. 重复的DNA序列——利用hash函数暴力求解
题解: 利用hash函数去求计算子串的hash值,若子串第一次出现则将其加入到map集合中,再次出现时利用set则保存重复的子串,最后并输出class Solution { public List<String> findRepeatedDnaSequences(String s) { //官网自带命名方式 return finSubstr(s); } static List finSubstr(String s){ //寻找子串 ..原创 2022-04-01 14:32:04 · 168 阅读 · 0 评论 -
利用hash值进行字符串匹配
public class test10 { public static void main(String[] args) { String s="abcdabcd"; //源串 String p="bcd"; //目标串 match(p,s); } static void match(String p,String s){ long hash_p=hashVal(原创 2022-03-31 16:21:46 · 630 阅读 · 0 评论 -
将字符串按单词翻转
// 将字符串按单词翻转,如 here you are 翻转成 are you herepublic class test { public static void main(String[] args) { String s="here you are "; String[] words = strReverse(s).split("\\s"); //将字符串翻转后再分割,you are here 翻转后为: ereh era uoy原创 2022-03-31 09:42:57 · 322 阅读 · 0 评论 -
通过Map集合判断两字符串的字符集是否相同
import java.util.HashMap;import java.util.Map;import java.util.Scanner;//判断两字符串的字符集是否相同public class test {public static void main(String[] args) {String s1=“abcccddaa”;String s2=“abcd”;boolean res=check(s1,s2);System.out.println(res);}static bo原创 2022-03-17 20:23:49 · 408 阅读 · 0 评论 -
压缩字符串——单向扫描法
输入样例:“aabcccccaaa”输出样例:a2b1c5a3 //判断字符串中有无重复字符public class test9 { public static void main(String[] args) { Scanner sc=new Scanner(System.in); String src=sc.nextLine(); int p=1; //定义指针,初始位于字符串第二个元素 int cont=1原创 2022-03-15 09:08:48 · 59 阅读 · 0 评论 -
判断字符串中有无重复字符——巧用ASCILL码
public class test9 { public static void main(String[] args) { Scanner sc=new Scanner(System.in); String src=sc.nextLine(); judge(src); } static void judge(String src){ int Rem=0; //记录重复字符数原创 2022-03-14 21:20:42 · 680 阅读 · 0 评论 -
将数组中0所在的行和列清零
public class test9 { public static void main(String[] args) { int[][]a={ {1,2,3,4}, {5,6,7,8}, {9,0,11,12}, {13,14,15,16}, {101,102,103,104} }; int[原创 2022-03-14 20:37:23 · 371 阅读 · 0 评论 -
顺时针打印二维数组
/**顺时针打印二维数组输入1,2,3,45,6,7,89,10,11,1213,14,15,16101,102,103,104输出1 2 3 4 8 12 16 104 103 102 101 13 9 5 6 7 11 15 14 10*/public class test9 { public static void main(String[] args) { int[][]a={ {1,2,3,4},原创 2022-03-13 21:42:58 · 372 阅读 · 0 评论 -
蓝桥杯2021省赛——时间显示
题目描述小蓝要和朋友合作开发一个时间显示的网站。在服务器上,朋友已经获取了当前的时间,用一个整数表示,值为从 197019701970 年 111 月 111 日 00:00:0000:00:0000:00:00 到当前时刻经过的毫秒数。现在,小蓝要在客户端显示出这个时间。小蓝不用显示出年月日,只需要显示出时分秒即可,毫秒也不用显示,直接舍去即可。给定一个用整数表示的时间,请将这个时间对应的时分秒输出。输入描述输入一行包含一个整数,表示时间。输出描述输出时分秒表示的当前时间,格式形如 HH:原创 2022-03-13 20:02:25 · 276 阅读 · 0 评论 -
快速排序-单向扫描分区法
快速排序算法学习原创 2022-03-11 19:15:54 · 213 阅读 · 0 评论 -
蓝桥杯2021省赛 拼卡片
public class test5 { public static void main(String[] args) { solve(); } static void solve( ){ int value=0; //记录卡片的数量 for (int i = 1; i < 50000; i++) { //进行枚举 String s=i+""; for (i.原创 2022-03-10 20:24:55 · 236 阅读 · 0 评论 -
洛谷UVA101——线性表
#include#include#include#include<Windows.h>using namespace std;vectorblock[30];int n; //木块总个数void location(int b,int &block_place,int &block_height) {for (int i = 0; i < n; i++) {for (int j = 0; j < block[i].size(); j++) {if.原创 2021-12-10 21:26:11 · 231 阅读 · 0 评论 -
通过 按位异或运算 找出落单的那个数
/* 利用按位与解题A^A=0A^0=A所以 ( arr[0]^arr[1] ^arr[2] ^…k ^ k.arr[arr.length-1] )=arr[0] ^arr[1] ^arr[2] ^arr[3] …k (arr[i]与arr[1+1]值相同,所有成对的按位与后都为0 )=k*/public class WeiYuanSuan2 {public static void main(String[] args) {int N=11;int arr[]= {1,1,2,2,3.原创 2021-07-07 22:02:21 · 122 阅读 · 0 评论 -
通过异或运算 找出唯一成对的数
package test;import java.util.Random;public class WeiYunSuan {public static void main(String[] args) {int N=1001;int arr[]=new int[N];Random random=new Random();for(int i=0;i<arr.length-1;i++){arr[i]=i+1; //填充数组arr[0]-arr[1000]} .原创 2021-07-07 21:32:44 · 245 阅读 · 0 评论 -
通过位运算 将整数的奇偶位互换
题目:将整数的奇偶位互换/*1001 奇偶位互换后为 0110① 1001 & 32个(1010…1010) 目的:保留奇数位, 偶数位结果为0② 1001 & 32个(0101…0101) 目的:保留偶数位, 奇数位结果为0①的结果右移 ^ ②的结果左移 实现奇偶互换^ (异或操作)*/public class 将整数的奇偶位互换 {public static void main(String[] args) {int x=9;int ou=x&am原创 2021-11-14 21:14:28 · 162 阅读 · 0 评论 -
通过位运算 求二进制中1 的个数
方法2示意图:package test;import java.util.Random;import java.util.Scanner;public class WeiYunSuan3 {public static void main(String[] args) { Random random=new Random(); Scanner sc=new Scanner(System.in); int n=sc.nextInt(); int count=0;.原创 2021-07-07 22:50:50 · 91 阅读 · 0 评论