【算法数据结构体系篇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 位…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
