【算法数据结构体系篇class13、14】:贪心算法思想
一、贪心算法概念
贪心算法概念:
1)最自然智慧的算法
2)用一种局部最功利的标准,总是做出在当前看来是最好的选择
3)难点在于证明局部最功利的标准可以得到全局最优解
4)对于贪心算法的学习主要以增加阅历和经验为主
二、给定一个由字符串组成的数组strs,必须把所有的字符串拼接起来,返回所有可能的拼接结果中,字典序最小的结果
package class13;import java.util.Arrays;
import java.util.TreeSet;/*** 给定一个由字符串组成的数组strs,* 必须把所有的字符串拼接起来,* 返回所有可能的拼接结果中,字典序最小的结果** 贪心算法* 1)最自然智慧的算法** 2)用一种局部最功利的标准,总是做出在当前看来是最好的选择** 3)难点在于证明局部最功利的标准可以得到全局最优解** 4)对于贪心算法的学习主要以增加阅历和经验为主** 贪心算法求解的标准过程* 1,分析业务** 2,根据业务逻辑找到不同的贪心策略** 3,对于能举出反例的策略直接跳过,不能举出反例的策略要证明有效性** 这往往是特别困难的,要求数学能力很高且不具有统一的技巧性** 贪心算法的解题套路* 1,实现一个不依靠贪心策略的解法X,可以用最暴力的尝试** 2,脑补出贪心策略A、贪心策略B、贪心策略C...** 3,用解法X和对数器,用实验的方式得知哪个贪心策略正确** 4,不要去纠结贪心策略的证明*/public class LowsetLexicography {//暴力解法 递归形式 将每个字符作为首部,依次拼接全部情况的结果集,存放到treeset有序集合,取出首元素就是最小的字典序排序拼接方式public static String lowestString1(String[] strs){if(strs == null || strs.length == 0){//null 或者长度0空数组则直接返回空字符串return "";}//有序表保存全部排序情况,返回首元素就是最小排序TreeSet<String> ans = process(strs);return ans.size() == 0 ? "":ans.first();}//递归思路,从左到右依次取字符串,然后递归 排除当前字符串的下个字符串数组,将其追加在当前字符串后public static TreeSet<String> process(String[] strs){//定义一个有序表结构保存结果集,用于返回TreeSet<String> ans = new TreeSet<>();//当字符串减少到0的时候,就直接返回空字符串if(strs.length == 0){//注意要加空字符,返回给上层调用才会有空异常ans.add("");return ans;}//依次遍历每个字符串for(int i = 0; i < strs.length; i++){//取当前遍历到的字符串拼接在首部String first = strs[i];//排除当前字符串 再将数组进行下层递归,直到空的时候,开始向上返回TreeSet<String> nexts = process(removeIndexString(strs,i));//向上依次拼接给当前节点字符后面for(String next : nexts){ans.add(first + next);}}//递归完成,全部排序返回,最后主程序取有序表的首元素,就是最小字典序return ans;}// {"abc", "cks", "bct"}// 0 1 2// removeIndexString(arr , 1) -> {"abc", "bct"}//每次移除当前节点元素,返回剩下的字符串数组集public static String[] removeIndexString(String[] strs, int index){//定义新数组集合以及索引String[] ans = new String[strs.length-1];int ans_index = 0;for(int i = 0;i < strs.length;i++){if(i != index){//遍历原数组,排除index索引,不等于的则赋值到新数组ans[ans_index++] = strs[i];}}return ans;}//贪心思想//字典序排序要最小,已知字典序的排序 "a" < "b" , "b" < "c" 存在传递性规律 所以"a" < "c"//而字符拼接后也一样 排序是具有传递性的://如果字符串a拼接字符串b < 字符串b拼接字符串a 那么就返回 前者,即a放b的前面 ;否则返回后者//按照这个排序定义比较器排序后,就按序拼接就是最小的://因为假设每个字符串交换到前面,它必定是大于未交换前的字符串拼接的public static String lowestString2(String[] strs){if(strs == null || strs.length == 0){return "";}//lambda表达式自定义比较器 参数 a b, 如果字符串数组 字符串a+b < b+a compareTo返回负数,a排前面 返回正数 b排前面Arrays.sort(strs,(a,b)->(a+b).compareTo(b+a));StringBuilder ans = new StringBuilder();for(String str:strs){ans.append(str);}return ans.toString();}// for testpublic static String generateRandomString(int strLen) {char[] ans = new char[(int) (Math.random() * strLen) + 1];for (int i = 0; i < ans.length; i++) {int value = (int) (Math.random() * 5);ans[i] = (Math.random() <= 0.5) ? (char) (65 + value) : (char) (97 + value);}return String.valueOf(ans);}// for testpublic static String[] generateRandomStringArray(int arrLen, int strLen) {String[] ans = new String[(int) (Math.random() * arrLen) + 1];for (int i = 0; i < ans.length; i++) {ans[i] = generateRandomString(strLen);}return ans;}// for testpublic static String[] copyStringArray(String[] arr) {String[] ans = new String[arr.length];for (int i = 0; i < ans.length; i++) {ans[i] = String.valueOf(arr[i]);}return ans;}public static void main(String[] args) {int arrLen = 6;int strLen = 5;int testTimes = 10000;System.out.println("test begin");for (int i = 0; i < testTimes; i++) {String[] arr1 = generateRandomStringArray(arrLen, strLen);String[] arr2 = copyStringArray(arr1);if (!lowestString1(arr1).equals(lowestString2(arr2))) {for (String str : arr1) {System.out.print(str + ",");}System.out.println();System.out.println("Oops!");}}System.out.println("finish!");}
}
三、贪心算法求解的标准过程
1,分析业务
2,根据业务逻辑找到不同的贪心策略
3,对于能举出反例的策略直接跳过,不能举出反例的策略要证明有效性
这往往是特别困难的,要求数学能力很高且不具有统一的技巧性
四、贪心算法的套路
1,实现一个不依靠贪心策略的解法X,可以用最暴力的尝试
2,脑补出贪心策略A、贪心策略B、贪心策略C...
3,用解法X和对数器,用实验的方式得知哪个贪心策略正确
4,不要去纠结贪心策略的证明
五、给定一个字符串str,只由‘X’和‘.’两种字符构成。X’表示墙,不能放灯,也不需要点亮‘.’表示居民点,可以放灯,需要点亮,如果灯放在i位置,可以让i-1,i和i+1三个位置被点亮,返回如果点亮str中所有需要点亮的位置,至少需要几盏灯
package class14;import java.util.HashSet;/*** 给定一个字符串str,只由‘X’和‘.’两种字符构成。* ‘X’表示墙,不能放灯,也不需要点亮* ‘.’表示居民点,可以放灯,需要点亮* 如果灯放在i位置,可以让i-1,i和i+1三个位置被点亮* 返回如果点亮str中所有需要点亮的位置,至少需要几盏灯** 贪心思想:根据题意 .是要被照亮。 而灯可以照亮三个. 求至少,那么就根据这个最大照亮三个点的情况来贪心 一个灯贪心照亮三个.*/
public class Light {public static int minLight1(String road) {if (road == null || road.length() == 0) {return 0;}return process(road.toCharArray(), 0, new HashSet<>());}// str[index....]位置,自由选择放灯还是不放灯// str[0..index-1]位置呢?已经做完决定了,那些放了灯的位置,存在lights里// 要求选出能照亮所有.的方案,并且在这些有效的方案中,返回最少需要几个灯public static int process(char[] str, int index, HashSet<Integer> lights) {if (index == str.length) { // 结束的时候for (int i = 0; i < str.length; i++) {if (str[i] != 'X') { // 当前位置是点的话if (!lights.contains(i - 1) && !lights.contains(i) && !lights.contains(i + 1)) {return Integer.MAX_VALUE;}}}return lights.size();} else { // str还没结束// i X .int no = process(str, index + 1, lights);int yes = Integer.MAX_VALUE;if (str[index] == '.') {lights.add(index);yes = process(str, index + 1, lights);lights.remove(index);}return Math.min(no, yes);}}//贪心思想public static int minLight2(String road) {//转换成字符数组 定义索引 与结果值char[] chars = road.toCharArray();int i = 0;int ans = 0;//遍历字符数组while(i < chars.length){//遇到X,不需要照亮,索引往下if(chars[i] == 'X'){i++;}else{//遇到. 进来先灯+1ans++;//如果i+1 是超过边界 也就是i 是最后一个索引的时候 就可以直接退出了。即使当前i是. 需要照亮,我们已经在前面先+1灯了if(i + 1 == chars.length){break;}else {// 还没到最后边界 那么分析几种情况://1. 下个字符 i+1 如果是X 那么灯+1,并且索引跳过X,来到i+2//2. 下个字符 i+1 如果是. 那么灯也要+1 这次索引来到i+3 因为不管i+3 是X还是. 都不需要去判断,因为灯可以照亮3个.//这里不管那么种情况,都是需要+1灯,所以统一放前面+1 这么负责索引的走向if(chars[i+1] == 'X'){i = i+2;}else {i = i+3;}}}}//最后返回ansreturn ans;}// 更简洁的解法// 两个X之间,数一下.的数量,然后除以3,向上取整// 把灯数累加public static int minLight3(String road) {char[] str = road.toCharArray();int cur = 0;int light = 0;for (char c : str) {if (c == 'X') {light += (cur + 2) / 3;cur = 0;} else {cur++;}}light += (cur + 2) / 3;return light;}// for testpublic static String randomString(int len) {char[] res = new char[(int) (Math.random() * len) + 1];for (int i = 0; i < res.length; i++) {res[i] = Math.random() < 0.5 ? 'X' : '.';}return String.valueOf(res);}public static void main(String[] args) {int len = 20;int testTime = 100000;for (int i = 0; i < testTime; i++) {String test = randomString(len);int ans1 = minLight1(test);int ans2 = minLight2(test);int ans3 = minLight3(test);if (ans1 != ans2 || ans1 != ans3) {System.out.println("oops!");}}System.out.println("finish!");}
}
六、切金条
一块金条切成两半,是需要花费和长度数值一样的铜板的。
比如长度为20的金条,不管怎么切,都要花费20个铜板。一群人想整分整块金条,怎么分最省铜板?
例如,给定数组{10,20,30},代表一共三个人,整块金条长度为60,金条要分成10,20,30三个部分。
如果先把长度60的金条分成10和50,花费60;再把长度50的金条分成20和30,花费50;一共花费110铜板。
但如果先把长度60的金条分成30和30,花费60;再把长度30金条分成10和20,花费30;一共花费90铜板。
输入一个数组,返回分割的最小代价。
package class14;import java.util.PriorityQueue;/*** 一块金条切成两半,是需要花费和长度数值一样的铜板的。* 比如长度为20的金条,不管怎么切,都要花费20个铜板。 一群人想整分整块金条,怎么分最省铜板?** 例如,给定数组{10,20,30},代表一共三个人,整块金条长度为60,金条要分成10,20,30三个部分。** 如果先把长度60的金条分成10和50,花费60; 再把长度50的金条分成20和30,花费50;一共花费110铜板。* 但如果先把长度60的金条分成30和30,花费60;再把长度30金条分成10和20, 花费30;一共花费90铜板。* 输入一个数组,返回分割的最小代价。*/public class LessMoneySplitGold {// 纯暴力!public static int lessMoney1(int[] arr) {if (arr == null || arr.length == 0) {return 0;}return process(arr, 0);}// 等待合并的数都在arr里,pre之前的合并行为产生了多少总代价// arr中只剩一个数字的时候,停止合并,返回最小的总代价public static int process(int[] arr, int pre) {if (arr.length == 1) {return pre;}int ans = Integer.MAX_VALUE;for (int i = 0; i < arr.length; i++) {for (int j = i + 1; j < arr.length; j++) {ans = Math.min(ans, process(copyAndMergeTwo(arr, i, j), pre + arr[i] + arr[j]));}}return ans;}public static int[] copyAndMergeTwo(int[] arr, int i, int j) {int[] ans = new int[arr.length - 1];int ansi = 0;for (int arri = 0; arri < arr.length; arri++) {if (arri != i && arri != j) {ans[ansi++] = arr[arri];}}ans[ansi] = arr[i] + arr[j];return ans;}//贪心思想:将每个数放到小根堆,依次取堆最小的两段合并,合并值就为当前的代价,再将合并的值添加回堆中进行上一次的合并//这个思路是反向的做法,相当于已经切好的段,从最下面开始两两合并直到最后我们堆合并成只有一个数,也就是整个数组的和时就//得到了这个最小代价public static int lessMoney2(int[] arr){//定义小根堆,把数组存放进去PriorityQueue<Integer> heap = new PriorityQueue<>();for(int num:arr){heap.add(num);}//定义分割总代价值与int sum = 0;//遍历每段数值,直到合并到只剩一个 也就是总和就退出while(heap.size() > 1){//合并最小两段,并且这两段的代价按照题意就是两端和,累加到sumint merge = heap.poll() + heap.poll();sum += merge;//然后需要把这次合并的段加回堆中,继续给上层合并heap.add(merge);}//最后返回sum就能得到最小代价分割值return sum;}// for testpublic static int[] generateRandomArray(int maxSize, int maxValue) {int[] arr = new int[(int) ((maxSize + 1) * Math.random())];for (int i = 0; i < arr.length; i++) {arr[i] = (int) (Math.random() * (maxValue + 1));}return arr;}public static void main(String[] args) {int testTime = 100000;int maxSize = 6;int maxValue = 1000;for (int i = 0; i < testTime; i++) {int[] arr = generateRandomArray(maxSize, maxValue);if (lessMoney1(arr) != lessMoney2(arr)) {System.out.println("Oops!");}}System.out.println("finish!");}}
七、一些项目要占用一个会议室宣讲,会议室不能同时容纳两个项目的宣讲。给你每一个项目开始的时间和结束的时间,你来安排宣讲的日程,要求会议室进行的宣讲的场次最多。返回最多的宣讲场次。
package class14;import java.util.Arrays;
import java.util.Comparator;/*** 一些项目要占用一个会议室宣讲,会议室不能同时容纳两个项目的宣讲。* 给你每一个项目开始的时间和结束的时间* 你来安排宣讲的日程,要求会议室进行的宣讲的场次最多。* 返回最多的宣讲场次。** [1,3],[2,5],[3,6]比如三个会议 起始点 同步安排会议最多场次就是安排第一和第三场* 两者时间不交集*/public class BestArrange {//会议类结构public static class Program{public int start;public int end;public Program(int s,int e){start = s;end = e;}}//贪心思想 将会议按照会议结束时间升序排序 早结束的排前面,然后就依次开始从头遍历匹配,//当前会议如果开始时间大于等于我们当前的时间,一开始时间初始值0, 那么就安排这个会议,并且//当前时间来到这个会议的结束时间,再往下个会议看,添加下个会议开始时间是大于等于当前时间的,//直到结束 就可以得到安排最多场次会议public static int bestArrange2(Program[] programs){//按照会议的结束时间 升序排序,先结束的会议放到数组前面Arrays.sort(programs, (o1, o2) -> o1.end - o2.end);//定义能安排多少场次会议, 当前时间节点 初始为0int ans = 0;int timeNow = 0;for(Program pro:programs){//遍历排好序的会议,如果当前会议开始时间大于等于 当前时间,那么就可以安排会议,并将当前时间赋值为该会议室的结束时间if(pro.start >= timeNow){ans++;timeNow = pro.end;}}return ans;}// 暴力!所有情况都尝试!public static int bestArrange1(Program[] programs) {if (programs == null || programs.length == 0) {return 0;}return process(programs, 0, 0);}// 还剩下的会议都放在programs里// done之前已经安排了多少会议的数量// timeLine目前来到的时间点是什么// 目前来到timeLine的时间点,已经安排了done多的会议,剩下的会议programs可以自由安排// 返回能安排的最多会议数量public static int process(Program[] programs, int done, int timeLine) {if (programs.length == 0) {return done;}// 还剩下会议int max = done;// 当前安排的会议是什么会,每一个都枚举for (int i = 0; i < programs.length; i++) {if (programs[i].start >= timeLine) {Program[] next = copyButExcept(programs, i);max = Math.max(max, process(next, done + 1, programs[i].end));}}return max;}public static Program[] copyButExcept(Program[] programs, int i) {Program[] ans = new Program[programs.length - 1];int index = 0;for (int k = 0; k < programs.length; k++) {if (k != i) {ans[index++] = programs[k];}}return ans;}// for testpublic static Program[] generatePrograms(int programSize, int timeMax) {Program[] ans = new Program[(int) (Math.random() * (programSize + 1))];for (int i = 0; i < ans.length; i++) {int r1 = (int) (Math.random() * (timeMax + 1));int r2 = (int) (Math.random() * (timeMax + 1));if (r1 == r2) {ans[i] = new Program(r1, r1 + 1);} else {ans[i] = new Program(Math.min(r1, r2), Math.max(r1, r2));}}return ans;}public static void main(String[] args) {int programSize = 12;int timeMax = 20;int timeTimes = 1000000;for (int i = 0; i < timeTimes; i++) {Program[] programs = generatePrograms(programSize, timeMax);if (bestArrange1(programs) != bestArrange2(programs)) {System.out.println("Oops!");}}System.out.println("finish!");}}
八、输入: 正数数组costs、正数数组profits、正数K、正数M costs[i]表示i号项目的花费 profits[i]表示i号项目在扣除花费之后还能挣到的钱(利润) K表示你只能串行的最多做k个项目 M表示你初始的资金 说明:每做完一个项目,马上获得的收益,可以支持你去做下一个项目。不能并行的做项目。输出:你最后获得的最大钱数。
package class14;import java.util.PriorityQueue;/*** 输入: 正数数组costs、正数数组profits、正数K、正数M* costs[i]表示i号项目的花费* profits[i]表示i号项目在扣除花费之后还能挣到的钱(利润)* K表示你只能串行的最多做k个项目* W表示你初始的资金* 说明: 每做完一个项目,马上获得的收益,可以支持你去做下一个项目。不能并行的做项目。* 输出:你最后获得的最大钱数。* <p>* 贪心思想:* 将每个项目的cost profit 都存放到一个类中 然后定义小根堆 大根堆 小根堆按cost排序 大根堆按profit排序* 然后从小根堆判断 取出来就是最小花费项目 与初始资金W比较 小的就可以做,就将其出堆,然后入大根堆* 最后我们判断入大根堆多个中的第一个 就是利益最大的 就做那个项目,同步刷新M 直到我们项目做完,或者我们资金不够做 退出*/
public class IPO {// 最多K个项目// W是初始资金// Profits[] Capital[] 一定等长// 返回最终最大的资金public static int findMaximizedCapital(int K, int W, int[] Profits, int[] Capital) {//定义小根堆 按花费排序 大根堆 按利润排序PriorityQueue<Program> minCostsHeap = new PriorityQueue<>((a, b) -> (a.costs - b.costs));PriorityQueue<Program> maxProfitsHeap = new PriorityQueue<>((a, b) -> (b.profits - a.profits));//遍历数组 利润和花费数组长度都是一样的 将利润 花费项目创建对象并入小根堆for (int i = 0; i < Profits.length; i++) {minCostsHeap.add(new Program(Profits[i], Capital[i]));}//开始判断能做多少项目使得最大Mfor (int i = 0; i < K; i++) {//当小根堆项目非空 并且资金W不小于小根堆顶项目的消费值 循环都入到大根堆,表示这些项目是可以做的while (!minCostsHeap.isEmpty() && minCostsHeap.peek().costs <= W){maxProfitsHeap.add(minCostsHeap.poll());}//这里需要提前判断 是否是存在能做的项目 假如costs 远大于当前W 那么就无法做,到不了K个项目 需要判空提前退出返回资金值if(maxProfitsHeap.isEmpty()){return W;}//入大根堆后,取堆顶项目做,利益最大,将其出堆 并累计利润给WW += maxProfitsHeap.poll().profits;}return W;}//定义一个类 存放项目的花费和利润public static class Program {public int profits; //利润public int costs; //花销public Program(int p, int c) {profits = p;costs = c;}}}
相关文章:
【算法数据结构体系篇class13、14】:贪心算法思想
一、贪心算法概念贪心算法概念:1)最自然智慧的算法2)用一种局部最功利的标准,总是做出在当前看来是最好的选择3)难点在于证明局部最功利的标准可以得到全局最优解4)对于贪心算法的学习主要以增加阅历和经验…...
C++知识点,关键字inline ,String,强制类型转化
🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️🔥专栏系列:线性代数,C初学者入门训练 🔥座右铭:“不要等到什么都没有了,才下定决心去做” 🚀🚀🚀大家觉不错…...

MyBatis源码分析(六)MetaObject工具类的使用与源码分析
文章目录一、MetaObject基本使用二、关键类源码分析1、MetaObject的构造方法2、PropertyTokenizer分词器3、BeanWrapper4、MetaClass5、DefaultReflectorFactory6、Reflector7、总结三、MetaObject的getValue源码分析写在后面一、MetaObject基本使用 public class User {priva…...

文献资源最多的文献下载神器,99.99%的文献都可下载
用对工具事半功倍,查找下载文献用对工具能节约大量的时间和精力去做更多的事情。 文献党下载器(wxdown.org),几乎整合了所有文献数据库资源,涵盖各种文献类型,包含全部学科。文献党下载器整合的资源如&…...

工控机ARM工业边缘计算机搭建Node-Red环境
搭建Node-Red环境Node-RED是一个基于Node.js的开源可视化流程编程环境,可以轻松构建自定义应用程序,通过连接简单的节点来完成复杂的任务。Node-RED提供了一种简单的方法,可以快速连接到外部服务,从而实现物联网应用的开发。Node-…...

位图/布隆过滤器/海量数据处理方式
位图 位图的概念 所谓位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景。通常是用来判断某个数据存不存在的。 直接来看问题: 给40亿个不重复的无符号整数,没排过序。给一个无符号整数࿰…...

Tomcat 配置文件数据库密码加密
几年前研究过Tomcat context.xml 中数据库密码改为密文的内容,因为当时在客户云桌面代码没有留备份也没有文章记录,最近项目又提出了这个需求就又重新拾起来学习一下。在网上找了一些资料,自己也大概试了一下,目前功能是实现了。参…...

k8s-Kubernetes集群部署
文章目录前言一、Kubernetes简介与架构1.Kubernetes简介2.kubernetes设计架构二、Kubernetes集群部署1.集群环境初始化2.所有节点安装kubeadm3.拉取集群所需镜像3.集群初始化4.安装flannel网络插件5.扩容节点6.设置kubectl命令补齐前言 一、Kubernetes简介与架构 1.Kubernetes…...

Python数据分析案例19——上市银行财务指标对比
我代码栏目都是针对基础的python数据分析人群,比如想写个本科毕业论文,课程论文,做个简单的案例分析等。过去写的案例可能使用了过多的机器学习和深度学习方法,文科的同学看不懂,可能他们仅仅只想用python做个回归或者…...
Python 中错误 ConnectionError: Max retries exceeded with url
出现错误“ConnectionError: Max retries exceeded with url”有多种原因: 向 request.get() 方法传递了不正确或不完整的 URL。我们正受到 API 的速率限制。requests 无法验证您向其发出请求的网站的 SSL 证书。 确保我们指定了正确且完整的 URL 和路径。 # ⛔️…...

SpringBoot下的Spring框架学习(Tedu)——DAY02
SpringBoot下的Spring框架学习(Tedu)——DAY02 目录SpringBoot下的Spring框架学习(Tedu)——DAY02Spring框架学习1.1 Spring介绍1.2 知识铺垫1.2.1 编辑Dog类1.2.2 编辑Cat类1.2.3 编辑测试类User.java1.2.4 上述代码的总结1.3 面…...
容易混淆的点:C语言中char* a[] 与 char a[] 的区别以及各自的用法
char* a[] 和 char a[] 的区别 char* a[] 和 char a[] 是 C 语言中数组的不同声明方式,二者具有以下区别: char a[] 声明的是一个字符数组,其中存储的是一串字符。此时,a 可以被视为一个指向字符的指针。 char* a[]则声明了一个…...

认识Spring(下)
作者:~小明学编程 文章专栏:Spring框架 格言:热爱编程的,终将被编程所厚爱。 目录 Spring更加高效的读取和存储对象 存储bean对象 五大注解 关于五大类注解 对象的注入 属性注入 构造方法注入 Setter注入 三种注入方式的…...
Educational Codeforces Round 144 (Rated for Div. 2) C - Maximum Set
传送门 题意: 对于一个集合,如果它的任意两个元素都能 有 其中一个能整除另一个,那么它是好的。问在区间[L,R] 中由这个区间某些数内构成的好的集合的最长长度是多少,以及且满足这个长度的好集合有多少个。(懒得想就借…...

学python的第四天---基础(2)
一、三角形类型读入数组并排序的方法nlist(map(float,input().split())) c,b,asorted(n)list_1 list(map(float, input().split())) list_1.sort() list_1.reverse()lengthssorted(map(float,input().split(" ")),reverseTrue)二、动物写法一:d{" &…...

spring之refresh流程-Java八股面试(六)
系列文章目录 第一章 ArrayList-Java八股面试(一) 第二章 HashMap-Java八股面试(二) 第三章 单例模式-Java八股面试(三) 第四章 线程池和Volatile关键字-Java八股面试(四) 第五章ConcurrentHashMap-Java八股面试(五) 动态每日更新算法题,想要学习的可以关注一下…...

【C语言】刷题|链表|双指针|指针|多指针|数据结构
主页:114514的代码大冒 qq:2188956112(欢迎小伙伴呀hi✿(。◕ᴗ◕。)✿ ) Gitee:庄嘉豪 (zhuang-jiahaoxxx) - Gitee.com 文章目录 目录 文章目录 前言 一、移除链表元素 二、反转链表 三,链表的中间结点 四&…...

糖化学类854262-01-4,Propargyl α-D-Mannopyranoside,炔丙基 α-D-吡喃甘露糖苷
外观以及性质:Propargyl α-D-Mannopyranoside一般为白色粉末状,糖化学类产品比较多,一般包括:葡萄糖衍生物、葡萄糖醛酸衍生物,氨基甘露糖衍生物、半乳糖衍生物、氨基半乳糖衍生物、核糖衍生物、阿拉伯糖衍生物、唾液…...

项目管理工具DHTMLX 在 G2 排名中再创新高
DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的大部分开发需求,具备完善的甘特图图表库,功能强大,价格便宜,提供丰富而灵活的JavaScript API接口,与各种服务器端技术&am…...

28 位委员出席,龙蜥社区第 15 次运营委员会会议顺利召开
2 月 24 日,龙蜥社区在海光召开了第 15 次运营委员会会议,本次会议由统信软件运营委员会委员崔开主持。来自 Arm、阿里云、飞腾、红旗软件、海光、Intel、龙芯、联通软研院、浪潮信息、普华基础软件、统信软件、万里红、移动、中科方德等理事单位的 28 位…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...

Android写一个捕获全局异常的工具类
项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler,它是Thread的子类(就是package java.lang;里线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都…...
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...
字符串哈希+KMP
P10468 兔子与兔子 #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; const int N 1000010; ull a[N], pw[N]; int n; ull gethash(int l, int r){return a[r] - a[l - 1] * pw[r - l 1]; } signed main(){ios::sync_with_stdio(false), …...

结构化文件管理实战:实现目录自动创建与归类
手动操作容易因疲劳或疏忽导致命名错误、路径混乱等问题,进而引发后续程序异常。使用工具进行标准化操作,能有效降低出错概率。 需要快速整理大量文件的技术用户而言,这款工具提供了一种轻便高效的解决方案。程序体积仅有 156KB,…...

react-pdf(pdfjs-dist)如何兼容老浏览器(chrome 49)
之前都是使用react-pdf来渲染pdf文件,这次有个需求是要兼容xp环境,xp上chrome最高支持到49,虽然说iframe或者embed都可以实现预览pdf,但为了后续的定制化需求,还是需要使用js库来渲染。 chrome 49测试环境 能用的测试…...