当前位置: 首页 > news >正文

day06_算法训练

一. Stream流

1.1 Stream流概述

概念: jdk1.8以后提供的新的API, 主要用于批量操作数据(集合的另外一种操作方式),代码非常简洁

流式处理思想:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.2 Stream对象获取

1.单列集合的Stream流对象获取
2.双列集合的Stream流对象获取
3.数组的Stream流对象获取
4.散装数据的Stream流对象获取
public class Test {public static void main(String[] args) {//1.创建单列集合Collection<String> names = new ArrayList<>();//2.Stream流对象的获取: stream()Stream<String> s1 = names.stream();System.out.println(s1);//3.创建双列集合对象Map<String,String> wifes = new HashMap<>();//4.Stream流对象获取: 把双列集合转换成单列集合(根据双列集合获取其键的集合或者是键值对的结合)获取Stream<String> s2 = wifes.keySet().stream();System.out.println(s2);Stream<Map.Entry<String, String>> s3 = wifes.entrySet().stream();System.out.println(s3);//5.创建数组对象String[] strs = {"张三三","李四四","王五五"};//6.获取流对象: Arrays.stream(数组)Stream<String> s4 = Arrays.stream(strs);System.out.println(s4);//7.借助于Stream接口的静态方法of,获取散装数据对应的流对象Stream<String> s5 = Stream.of("张三三", "李四四", "王五五");System.out.println(s5);}
}

3.3 Stream流常用方法

中间方法: 如果该方法的返回值类型是Stream

​ Stream filter(Predicate predicate): 对数据进行过滤操作

​ Stream limit(long n): 取数据源中前n个数据

​ Stream skip(long n): 跳过数据源中前n个数据

​ Stream distinct(): 去重重复的元素

​ Stream sorted(): 排序

终结方法:如果该方法的返回值类型不是Stream

​ void foreach(Comsumer c): 把最终留下的数据挨个遍历

​ int count(): 统计个数

静态方法:

​ Stream concat(Stream s1,Stream s2): 合并s1和s2可操作的数据到一个流中

注意: 同一个Stream流对象,只能调用一次方法(中间还是终结)

public class Test {public static void main(String[] args) {//创建集合,获取Stream流对象List<Integer> nums = new ArrayList<>();nums.add(4);nums.add(6);nums.add(3);nums.add(2);nums.add(5);//获取流对象Stream<Integer> s1 = nums.stream();//取出所有的偶数/*Predicate: 提供判断规则的接口boolean test(数据): 重写test的方法,如果test的方法返回true,则该数据满足条件,否则不满足条件*//*Stream<Integer> s2 = s1.filter(new Predicate<Integer>() {@Overridepublic boolean test(Integer integer) {//判断规则return integer % 2 == 0;}});*//*Stream<Integer> s2 = s1.filter((Integer integer)->{return integer % 2 == 0;});*/Stream<Integer> s2 = s1.filter(integer ->integer % 2 == 0);//注意: 同一个Stream流对象,只能调用一次方法(中间还是终结),//取出所有偶数中大于2的数据/*Stream<Integer> s3 = s2.filter(new Predicate<Integer>() {@Overridepublic boolean test(Integer integer) {return integer > 2;}});*/Stream<Integer> s3 = s2.filter(integer -> integer > 2);//数据所有满足条件的数据/*Consumer: 提供数据的消费规则的接口void accept(数据): 重写accept方法, accept方法的方法体就是该数据的消费逻辑*//*s2.forEach(new Consumer<Integer>() {@Overridepublic void accept(Integer integer) {//消费的逻辑System.out.println("当前数据为: " + integer);}});*/s3.forEach(new Consumer<Integer>() {@Overridepublic void accept(Integer integer) {//消费的逻辑System.out.println("当前数据为: " + integer);}});}
}

public class Test2 {public static void main(String[] args) {//创建集合,获取Stream流对象List<Integer> nums = new ArrayList<>();nums.add(4);nums.add(6);nums.add(3);nums.add(2);nums.add(5);//获取流对象//Stream<Integer> s1 = nums.stream();//Stream<Integer> s2 = s1.filter(integer -> integer % 2 == 0);//Stream<Integer> s3 = s2.filter(integer -> integer > 2);/*s3.forEach(new Consumer<Integer>() {@Overridepublic void accept(Integer integer) {//消费的逻辑System.out.println("当前数据为: " + integer);}});*///Stream流的链式调用书写方式  终极写法nums.stream().filter(integer -> integer % 2 == 0).filter(integer -> integer > 2).forEach(integer -> System.out.println("当前数据为: " + integer));}
}
public class Test3 {public static void main(String[] args) {//创建两个集合对象List<Integer> nums1 = new ArrayList<>();nums1.add(2);nums1.add(4);nums1.add(6);nums1.add(8);nums1.add(10);List<Integer> nums2 = new ArrayList<>();nums2.add(1);nums2.add(3);nums2.add(5);nums2.add(7);nums2.add(9);nums2.add(9);//limit方法: 获取nums1中的前3个数据nums1.stream().limit(3).forEach(num -> System.out.println(num));//skip方法: 获取nums2中的后3个数据nums2.stream().skip(2).forEach(num -> System.out.println(num));//distinct方法: 去重System.out.println("===================");nums2.stream().distinct().forEach(num -> System.out.println(num));//concat方法: 合并两个流, 将集合nums1和nums2中的数据合并System.out.println("=========================");Stream.concat(nums1.stream(), nums2.stream()).forEach(num -> System.out.println(num));//sorted方法:对流可操作的元素排序,将集合nums1和nums2中的数据合并,并排序System.out.println("=======================");//Stream.concat(nums1.stream(),nums2.stream()).sorted().forEach(num-> System.out.println(num));Stream.concat(nums1.stream(), nums2.stream()).sorted((o1, o2) -> o2 - o1).forEach(num -> System.out.println(num));//count方法: 统计当前流中可操作的数据个数, 将集合nums1和nums2中的数据合并,并统计个数输出long count = Stream.concat(nums1.stream(), nums2.stream()).count();System.out.println(count);}
}

二. 刷题

案例1:打印折纸的次数

需求:世界最高山峰是珠穆朗玛峰(8844.43米=8844430毫米),假如我有一张足够大的纸,它的厚度是0.1毫米。

请问,我折叠多少次,可以折成珠穆朗玛峰的高度?

public class Test01 {/*需求:世界最高山峰是珠穆朗玛峰(8844.43米=8844430毫米),假如我有一张足够大的纸,它的厚度是0.1毫米。请问,我折叠多少次,可以折成珠穆朗玛峰的高度?*/public static void main(String[] args) {/*1.定义变量,把数据记录下来2.while循环模拟折叠过程*///1.定义变量,记录珠峰高度和纸的厚度double mountainHeight = 8844430;double paperThickness = 0.1;//2.定义变量,记录折叠的次数int count = 0;//3.循环折叠: 3.1 纸张厚度翻番, 3.2 折叠次数增1/*while (true){//当满足某些条件的时候,break结束循环//3.1 纸张厚度翻番paperThickness *= 2;//3.2 折叠次数增1count++;//判断纸张厚度是否达到了珠峰的高度if (paperThickness >= mountainHeight){//是 结束循环break;}}*/while (paperThickness < mountainHeight) {//3.1 纸张厚度翻番paperThickness *= 2;//3.2 折叠次数增1count++;}System.out.println(count);}
}

案例2:逢七过

朋友聚会的时候可能会玩一个游戏:逢7过

游戏规则:从任意一个数字开始报数,当你要报的数字是包含7或者是7的倍数时都要说过:过

需求:使用程序在控制台打印出1-100之间的满足逢七必过规则的数据

public class Test02 {/*朋友聚会的时候可能会玩一个游戏:逢7过游戏规则:从任意一个数字开始报数,当你要报的数字是包含7或者是7的倍数时都要说过:过需求:使用程序在控制台打印出1-100之间的满足逢七必过规则的数据*/public static void main(String[] args) {/*1.得到1~100之间的每个数字 for2.判断当前数字是不是包含7或者7的倍数3.如果满足,输出该数据*///1.得到1~100之间的每个数字 forfor (int i = 1; i <= 100; i++) {//2.判断当前数字是不是包含7或者7的倍数/*i 1位数(7), 2位数,3位数(100)两位数: 拿到各位的数字和十位的数字分别判断是不是7178: 个位8: 178%10   十位: 178/10---17%10--->7*/int ge = i % 10;int shi = i / 10 % 10;if (i % 7 == 0 || (ge == 7 || shi == 7)){System.out.println(i);}}}
}

案例3:猜数字小游戏

需求:程序自动生成一个1-100之间的随机数字,使用程序实现猜出这个数字是多少?

public class Test03 {//需求:程序自动生成一个1-100之间的随机数字,使用程序实现猜出这个数字是多少?public static void main(String[] args) {/*1.生成1~100之间的随机数2.借助于Scanner获取用户猜的数字 while3.比对两个数字猜大了:继续猜猜小了:继续猜猜对了:结束*///1.生成1~100之间的随机数Random random = new Random();int randomNumber = random.nextInt(100) + 1; // 生成1到100的随机数//System.out.println(randomNumber);//2.借助于Scanner获取用户猜的数字 whileScanner sc = new Scanner(System.in);while (true){System.out.println("请输入您要猜的数据[1~100]: ");int inputNumber = sc.nextInt();//3.比对两个数字if (inputNumber > randomNumber){//猜大了:继续猜System.out.println("猜大了:继续猜");}else if (inputNumber < randomNumber){//猜小了:继续猜System.out.println("猜小了:继续猜");}else{//猜对了:结束System.out.println("猜对了:游戏结束,欢迎下次使用!");break;}}}
}

案例4:求平方根

给你一个int范围内的非负整数 x ,计算并返回 x 的 算术平方根 。

由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

注意:不要用Java已经提供的API

比如:输入:x = 4 输出:2

比如:输入:x = 8 输出:2

​ 解释:8 的算术平方根是 2.82842…, 由于返回类型是整数,小数部分将被舍去。


public class Test04 {/*给你一个int范围内的非负整数 x ,计算并返回的 算术平方根 。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。注意:不要用Java已经提供的API比如:输入:x = 4	输出:2比如:输入:x = 8	输出:2解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。*/public static void main(String[] args) {System.out.println(calculate(4));//2System.out.println(calculate(8));//2System.out.println(calculate(16));//4System.out.println(calculate(15));//3System.out.println(calculate(0));//0System.out.println(calculate(1));//1}//定义一个方法,去任意非负整数的 整数平方根public static int calculate(int x) {//求if (x==0){return 0;}if (x==1){return 1;}/*1019 整数平方根  3130*30=90031*31=96131.xx*31.xx = 101932*32=102433*33=108935*35=122540*40=1600x 整数平方根找一个最大的数字的平方 < x从小往大找  0,1,2,3...从大往小找: 不知道从哪开始确定:从小往大找  0,1,2,3...  目标: 找一个最大的数字的平方 < x标准: 从小往大找,找到的第一个数字的平方>x,  该数字-1*/int target = -1;//1.找到从0开始到x之间的每一个数字for (int i = 0; i <= x; i++) {//2.判断当前i的平方是不是大于xif (i * i > x){target = i-1;break;}}return target;}}

案例5:两数相除

需求:

​ 给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求 不使用 乘法、除法和取余运算。

​ 整数除法应该向零截断,也就是截去(truncate)其小数部分。

​ 例如,8.345 将被截断为 8 ,-2.7335 将被截断至 -2 。

​ 返回被除数 dividend 除以除数 divisor 得到的 商 。

public class Test05 {/*需求:给你两个整数,被除数dividend和除数divisor。将两数相除,要求 不使用 乘法、除法和取余运算。整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345 将被截断为 8 ,-2.7335 将被截断至 -2 。返回被除数dividend除以除数divisor得到的 商 。*/public static void main(String[] args) {System.out.println(calculate(11, 2));System.out.println(calculate(-11, -2));System.out.println(calculate(-11, 2));System.out.println(calculate(11, -2));System.out.println(calculate(0, -2));}//定义方法,完成需求: 求两个整数的商public static int calculate(int divided, int divisor) {//异或判断同号或异号//求商/*9÷3:转化为 9 是几个3相加的结果9 - 3 = 6  16 - 3 = 3  23 - 3 = 0  30 - 3 = -3只要拿着被除数不断的减除数,直到差为0为止7÷2:转化为 7 是 几个2相加的结果7 - 2 = 5 15 - 2 = 3 23 - 2 = 1 31 - 2 = -1如果不等你整除: 拿着被除数不断的减除数,直到差为负数为止*///定义变量,记录商(统计减了多少次)int count = 0;if (divided >= 0 && divisor > 0) {//1.使用while循环,模拟减多次while (true) {divided = divided - divisor;//判断divided是不是负数if (divided < 0) {//不用再减了,结束循环break;}//统计变量+1count++;}} else if (divided < 0 && divisor < 0) {divided = -divided;divisor = -divisor;//1.使用while循环,模拟减多次while (true) {divided = divided - divisor;//判断divided是不是负数if (divided < 0) {//不用再减了,结束循环break;}//统计变量+1count++;}} else if (divided < 0 && divisor > 0) {divided = -divided;//1.使用while循环,模拟减多次while (true) {divided = divided - divisor;//判断divided是不是负数if (divided < 0) {//不用再减了,结束循环break;}//统计变量+1count++;}count = -count;}else{divisor = -divisor;//1.使用while循环,模拟减多次while (true) {divided = divided - divisor;//判断divided是不是负数if (divided < 0) {//不用再减了,结束循环break;}//统计变量+1count++;}count = -count;}//返回商return count;}}

案例6:求质数

需求1:键盘录入一个正整数 x ,判断该整数是否为一个质数(质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数)。

需求2:给定一个范围,比如100~1000,统计这个范围内有多少个质数。


public class Test06 {/*需求1:键盘录入一个正整数 x ,判断该整数是否为一个质数。需求2:给定一个范围,比如100~1000,统计这个范围内有多少个质数。*/public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("请输入一个整数: ");int num = sc.nextInt();System.out.println(isPrimeNumber(num));//得到100~1000之间的每个数字int count = 0;for (int i = 100; i <= 1000; i++) {if (isPrimeNumber(i)) {//是质数count++;}}System.out.println(count);}//定义方法,判断某个数是不是质数public static boolean isPrimeNumber(int num) {//合法性的校验if (num <= 1) {return false;}//是不是质数: 2~num-1 中的某个数能不能整除numboolean flag = true;//默认num是质数for (int i = 2; i < num; i++) {if (num % i == 0) {//num不是质数flag = false;}}return flag;}}

案例7:2 的幂

定义一个方法,传递一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。

如果存在一个整数 x 使得 n == 2的x次方,则认为 n 是 2 的幂次方。

扩展:3的幂 4的幂

比如:

输入:n = 1
输出:true
解释:2的0次方 = 1输入:n = 16
输出:true
解释:2的4次方 = 16输入:n = 3
输出:false
public class Test07 {/*定义一个方法,传递一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。如果存在一个整数 x 使得n == 2的x次方,则认为 n 是 2 的幂次方。扩展:3的幂  4的幂*/public static void main(String[] args) {System.out.println(judge(1));System.out.println(judge(2));System.out.println(judge(4));System.out.println(judge(6));System.out.println(judge(8));}//定义一个方法,传递一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。public static boolean judge(int n) {//合法性校验if (n <= 0){return  false;}//是不是2的幂次方/*1616/2=88/2=44/2=22/2=16464/2=3232/2=1616/2=88/2=44/2=22/2=11818/2=9如果某个数是2的幂次方,如果当前数字可以被2整除,那么不断的对2做除法,最终得到1*/while (true) {//1.判断当前n能不能对2做除法运算  n % 2 == 0if (n % 2 == 0) {//2.用 n 对 2做除法运算n = n / 2;}else{break;}}return n == 1;}}

案例8:数组排序

定义一个数组:{3,10,7,9,5,1,2,8}

需求1:利用冒泡排序将数组按照从小到大的形式进行排列

需求2:利用选择排序将数组按照从小到大的形式进行排列

public class Test08 {/*定义一个数组:{3,10,7,9,5,1,2,8}需求1:利用**冒泡排序**将数组按照从小到大的形式进行排列需求2:利用**选择排序**将数组按照从小到大的形式进行排列*/public static void main(String[] args) {int[] arr = {3,10,7,9,5,1,2,8};//bubble(arr);select(arr);System.out.println(Arrays.toString(arr));}public static void bubble(int[] arr) {//对arr进行冒泡排序/*过程: 1.每次确定一个待排序数据范围内的最大的值放到待排序数据范围的最右侧, 2.从左往右,在待排序数据范围内,数据两两比较,如果前面的比后面的大,则两个数据交换位置{3,10,7,9,5,1,2,8}第一次:待排序的数据 {3,10,7,9,5,1,2,8} {3,7,10,9,5,1,2,8} {3,7,9,10,5,1,2,8} {3,7,9,5,10,1,2,8} {3,7,9,5,1,10,2,8} {3,7,9,5,1,2,10,8} {3,7,9,5,1,2,8,10}第二次: 10已经确定了 arr.length-1待排序的数据(0~arr.length-2) {3,7,9,5,1,2,8,10}  {3,7,5,9,1,2,8,10} {3,7,5,1,9,2,8,10} {3,7,5,1,2,9,8,10} {3,7,5,1,2,8,9,10}第三次: 9,10已经确定了待排序的数据(0~arr.length-3) {3,7,5,1,2,8,9,10}  {3,5,7,1,2,8,9,10} {3,5,1,7,2,8,9,10} {3,5,1,2,7,8,9,10}.....第七次:{1,2,3,5,7,8,9,10}注意:每一轮排序,只能确定待排序范围内最右侧的元素需要排:n-1次,排n次也可以下一轮排序,待排序的范围比上一轮少一个,如果上一轮是0,n 下一轮就是0,n-1*///1.确定排序的次数for (int i = 0; i < arr.length; i++) {//第1次,第2次...第n次//2.确定每次待排序的索引范围/*i = 0, 第1次,(0,arr.length-1)  (0,arr.length-1-0)i = 1, 第2次,(0,arr.length-2)  (0,arr.length-1-1)i = 2, 第3次,(0,arr.length-3)  (0,arr.length-1-2)....i和待排序范围的关系为  (0,arr.length-1-i)*///3.遍历待排序范围内的元素,拿着当前元素和下一个元素比较for (int j = arr.length-1; j < (arr.length - 1 - i); j++) {//4.如果当前元素 > 下一个元素 交换位置if (arr[j] > arr[j + 1]) {//交换j索引和j+1索引处的元素int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}}public static void select(int[] arr){/*选择排序: 每一次选择过程,都是选择待排序范围内,最小的元素,和待排序范围内的最左侧的元素进行交换位置{3,10,7,9,5,1,2,8}第一次:待排序的数据范围(0,arr.length-1) {3,10,7,9,5,1,2,8} 最小元素:1 所在的索引5, 交换索引0和索引5的元素  {1,10,7,9,5,3,2,8}第二次:待排序的数据范围(1,arr.length-1) {1,10,7,9,5,3,2,8} 最小元素:2 所在的索引6, 交换索引?和索引6的元素  {1,2,7,9,5,3,10,8}第三次待排序的数据范围(2,arr.length-1) {1,2,7,9,5,3,10,8} 最小元素:3 所在的索引5, 交换索引? 和索引5处的元素{1,2,3,9,5,7,10,8}....第n-1次{1,2,3,5,7,8,9,10}注意:要选择 n-1轮, n轮也可以*///1.确定排序多少轮for (int i = 0; i < arr.length; i++) {//2.确定待排序范围/*当i = 0,第一次,(0,arr.length-1)当i = 1,第二次,(1,arr.length-1)当i = 2,第三次,(2,arr.length-1)...(i,arr.length-1)*///3.找到待排序范围内,最小元素所在的索引//定义变量,记录最小元素所在的索引int index = i;//默认认为索引i处的元素就是最小值所在的索引for (int j = i+1; j < arr.length; j++) {//比较索引index处的元素和索引j处的元素的大小if (arr[j] < arr[index]){index = j;//修正}}//4.交换最左侧的元素(i)和最小值的元素(index)int temp = arr[i];arr[i] = arr[index];arr[index] = temp;}}}

案例9:查找数据

定义一个数组:{1,2,3,4,5,6,7,8,9,10},利用二分查找法,查找其中任意数据的索引

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

代码示例:

public class Test09 {/*定义一个数组:{1,2,3,4,5,6,7,8,9,10},利用二分查找法,查找其中任意数据的索引*/public static void main(String[] args) {int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};System.out.println(findIndex(arr,14));}//定义一个方法,在某个数组中查询指定数据所在的索引public static int findIndex(int[] arr, int target) {//二分查找//1.定义两个指针,默认分别指向数组的头部和尾部int left = 0, right = arr.length - 1;//2.定义变量,记录目标值在数组中出现的索引int index = -1;//默认为-1.代表不存在//3.多次比较,多次移动while (true) {//1.确保 right >= leftif (right < left) {break;}//2.找到中间值int mid = (left + right) / 2;//3.进行比对if (target > arr[mid]){//向右走left = mid+1;}else if (target < arr[mid]){//向左走right = mid-1;}else{//找到了index = mid;break;}}return index;}
}

案例10:整数反转(大整数算法)

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

暂时不用考虑数据太大的问题,把本题的核心思路写出来即可

比如:

​ 输入:x = 123
​ 输出:321

​ 输入:x = -123
​ 输出:-321

​ 输入:x = 120
​ 输出:21

​ 输入:x = 0
​ 输出:0

要注意,考虑到特殊情况:数字大于2147483647,反转之后就超出范围了,此时就要返回0

= -1;//默认为-1.代表不存在
//3.多次比较,多次移动
while (true) {
//1.确保 right >= left
if (right < left) {
break;
}

        //2.找到中间值int mid = (left + right) / 2;//3.进行比对if (target > arr[mid]){//向右走left = mid+1;}else if (target < arr[mid]){//向左走right = mid-1;}else{//找到了index = mid;break;}}return index;
}

}


## 案例10:整数反转(大整数算法)给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。暂时不用考虑数据太大的问题,把本题的核心思路写出来即可比如:​	输入:x = 123
​	输出:321​	输入:x = -123
​	输出:-321​	输入:x = 120
​	输出:21​	输入:x = 0
​	输出:0要注意,考虑到特殊情况:数字大于2147483647,反转之后就超出范围了,此时就要返回0

相关文章:

day06_算法训练

一. Stream流 1.1 Stream流概述 概念: jdk1.8以后提供的新的API, 主要用于批量操作数据(集合的另外一种操作方式),代码非常简洁 流式处理思想: 2.2 Stream对象获取 1.单列集合的Stream流对象获取 2.双列集合的Stream流对象获取 3.数组的Stream流对象获取 4.散装数据的St…...

@SpringBootTest单元测试中报错:无法自动装配,找不到 ‘XXX‘ 类型的 Bean

一开始照着网上教程讲Springboot原理中的代码来copy写的↓ import com.google.gson.Gson; import com.itheima.pojo.Result; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.cont…...

nodemon学习(一)简介、安装、配置、使用

nodemon用来监视node.js应用程序中的任何更改并自动重启服务,非常适合用在开发环境中。以前&#xff0c;我们开发一个node后端服务时&#xff0c;每次更改文件&#xff0c;均需重启一下&#xff0c;服务才能生效。这使我们的开发效率降低了很多。nodemon的出现&#xff0c;可以…...

【Qt从摄像头视频中获取数据】

有时候需要在视频上画图&#xff0c;所以需要能获取到每一帧视频数据。 以前从视频文件或视频流中得到帧&#xff0c;一般都是使用qt ffmpeg或qt vlc。 qt对显示处理视频大体有以下方法&#xff1a; QMediaPlayer QVideoWidget 这种方法只适合简单的显示视频功能&#xff…...

视频截取中的UI小组件

引言 视频截取在社交类 APP 中十分常见。有了上传视频的功能&#xff0c;就不可避免地需要提供截取和编辑的选项。如果我们过度依赖第三方库&#xff0c;项目的代码可能会变得异常臃肿&#xff0c;因为这些库往往包含许多我们用不到的功能&#xff0c;而且它们的 UI 样式和功能…...

java设计模式--结构型模式

结构性模式&#xff1a;适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式 适配器模式 适配器模式&#xff08;Adapter Pattern&#xff09; 充当两个不兼容接口之间的桥梁&#xff0c;属于结构型设计模式。目的是将一个类的接口转换为另一个接口&am…...

消息中间件:Kafka消息丢失与堆积问题分析与解决方案

消息中间件&#xff1a;Kafka消息丢失与堆积问题分析与解决方案 Kafka作为分布式消息系统&#xff0c;广泛应用于实时数据流处理、大数据分析等领域。然而&#xff0c;在实际应用中&#xff0c;Kafka可能会面临消息丢失和消息堆积的问题&#xff0c;这些问题如果得不到有效处理…...

mac终端代理配置指南

终端代理配置指南 在 macOS 中&#xff0c;你可以通过几种不同的方法来配置终端代理。这里介绍两种常见的设置方式&#xff1a;使用 alias 和 shell 函数。 方法 1&#xff1a;使用 Alias 配置代理 打开终端配置文件 默认情况下&#xff0c;macOS 终端使用的是 zsh。如果你的系…...

mbedTLS生成客户端,服务端密钥及CA证书

1. mbedTLS源码&#xff1a;https://github.com/Mbed-TLS/mbedtls.git 2. 生成步骤&#xff1a; 2.1 编译上述源码 2.2 生成CA私钥和自签名证书&#xff1a; 进入编译的build目录&#xff0c;比如&#xff1a;/mbedtls-development/build# 2.2.1生成CA私钥 执行下面的命令&…...

如何有效应对突发技术故障:以网易云音乐为例

引言 在互联网行业&#xff0c;任何一个在线服务都可能遭遇突发的技术故障。这些故障不仅影响用户体验&#xff0c;还可能对公司的品牌形象造成损害。因此&#xff0c;如何快速响应并高效解决这些问题成为了每一个开发团队的重要课题。本文将以网易云音乐在2024年8月19日下午遭…...

上传文件到github仓库

REF: https://blog.csdn.net/litianxiang_kaola/article/details/74075151 已有repository&#xff0c;往仓库里更新内容 点击gitlab里的clone 在git bash中使用git clone&#xff0c;这个时候会将网上的仓库下载到本地&#xff0c;你可以把想要更新的内容直接拖到仓库里 …...

clip-path实现图片边角的裁剪

img {clip-path: polygon(0 7px,7px 0,calc(100% - 20px) 0,100% 20px,100% 100%,16px 100%,0 calc(100% - 16px));}每一个逗号隔开的就是路径坐标 左上角的两个点 0 7px &#xff0c;7px 0 右上角 calc(100% - 20px) 0,100% 20px 相当于通过这些点练成的线的圈起来的部分就是剩…...

【C++ Primer Plus习题】2.7

问题: 解答: #include <iostream> using namespace std;void print(int hour, int minute) {cout << "Time:" << hour << ":" << minute << endl; }int main() {int hour0;int minute 0;cout << "请输入…...

uboot中 fastboot udp 协议分析

注&#xff1a; 1. 本文所分析的fastboot源码不是android下的源码&#xff0c;而是恩智浦芯片厂商在IMX6UL芯片的uboot源码中自己实现的源码&#xff0c;二者不同&#xff0c;请读者注意区分。一些图片是网上找到的&#xff0c;出处不好注明&#xff0c;请见谅。 2. 分析fastbo…...

redis hash类型的命令

1.hset 格式&#xff1a; hset key field value [field value ...]&#xff08;value是字符串&#xff09; 返回值&#xff1a;设置成功的键值对的个数 2.hget&#xff1a;获取键值对 格式:hget key field 3.hexists&#xff1a;判断hash中是否存在指定 格式&#xff1a;…...

【OpenCV】 中使用 Lucas-Kanade 光流进行对象跟踪和路径映射

文章目录 一、说明二、什么是Lucas-Kanade 方法三、Lucas-Kanade 原理四、代码实现4.1 第 1 步&#xff1a;用户在第一帧绘制一个矩形4.2 第 2 步&#xff1a;从图像中提取关键点4.3 第 3 步&#xff1a;跟踪每一帧的关键点 一、说明 本文针对基于光流法的目标追踪进行叙述&am…...

ES 支持乐观锁吗?如何实现的?

本篇主要介绍一下Elasticsearch的并发控制和乐观锁的实现原理&#xff0c;列举常见的电商场景&#xff0c;关系型数据库的并发控制、ES的并发控制实践。 并发场景 不论是关系型数据库的应用&#xff0c;还是使用Elasticsearch做搜索加速的场景&#xff0c;只要有数据更新&…...

前端宝典十一:前端工程化稳定性方案

一、工程化体系介绍 1、什么是前端工程化 前端工程化 前端 软件工程&#xff1b;前端工程化 将工程方法系统化地应用到前端开发中&#xff1b;前端工程化 系统、严谨、可量化的方法开发、运营和维护前端应用程序&#xff1b;前端工程化 基于业务诉求&#xff0c;梳理出最…...

yum 数据源的切换

本来准备安装一个ntp 服务器时间进行同步&#xff0c;但是使用yum install ntp -y 但是却失败了 原因是yum自带的镜像源不能用了&#xff0c;所以要想使用yum 多功能只能切换yum 对应的镜像源了 如果你的服务商是可以使用wget命令的&#xff1a; wget -O /etc/yum.repos.d/Ce…...

MySQL入门学习-命令行工具.mysqlbinlog

MySQL 命令行工具mysqlbinlog用于处理二进制日志文件。 一、关于mysqlbinlog工具的详细介绍&#xff1a; 1、命令行工具mysqlbinlog的特点和使用方法&#xff1a; - 特点&#xff1a; - 可以解析和查看二进制日志文件的内容。 - 支持多种输出格式&#xff0c;如文本、SQ…...

WARNING XXX is not overriding the create method in batch

WARNING XXX is not overriding the create method in batch api.modeldef create(self, vals):quvals[name]youqu self.env[crm.qu].sudo().search([(name, , qu),(shi_id,,vals[shi_id])])if len(youqu)>0:raise UserError(_("该区名已存在&#xff0c;无需再填加…...

使用预训练的 ONNX 格式的目标检测模型(基于 YOLOv8n-pose)姿态监测

具体步骤如下&#xff1a; 加载图像&#xff1a; 从指定路径读取一张图像&#xff08;这里假设图像名为bus.jpg&#xff09;。将图像从 BGR 颜色空间转换为 RGB 颜色空间。 图像预处理&#xff1a; 计算图像的高度、宽度&#xff0c;并确定其中的最大值作为新图像的边长。创建一…...

matlab实现模拟退火算法

模拟退火算法&#xff08;Simulated Annealing, SA&#xff09;是一种通用概率优化算法&#xff0c;用于在给定的大搜索空间内寻找问题的近似全局最优解。该算法灵感来源于物理学中固体物质的退火过程&#xff0c;其中温度逐渐降低&#xff0c;粒子逐渐趋于能量最低状态。 在M…...

【Prettier】代码格式化工具Prettier的使用和配置介绍

前言 前段时间&#xff0c;因为项目的prettier的配置和eslint格式检查有些冲突&#xff0c;在其prettier官网和百度了一些配置相关的资料&#xff0c;在此做一些总结&#xff0c;以备不时之需。 Prettier官网 Prettier Prettier 是一种前端代码格式化工具&#xff0c;支持ja…...

【计算机网络】网络基础

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…...

MFC在对话框中实现打印和打印预览

首先在这里感谢互联网的大哥们&#xff01;同时我讨厌动不动就是要vip才能查看&#xff01;所以我写的不需要vip就能看。只求点个赞。 直接上代码&#xff0c;新建6个文件CPrintFrame.cpp&#xff1b;CPrintFrame.h&#xff1b;CPrintPreviewView.cpp&#xff1b;CPrintPrevie…...

移动端页面出现闪屏

v-cloak 的作用和用法 用法&#xff1a; 这个指令保持在元素上直到关联实例结束编译。和 CSS 规则如 [v-cloak] { display: none } 一起用时&#xff0c;这个指令可以隐藏未编译的 Mustache 标签直到实例准备完毕。官方API {{msg}} HTML 绑定 Vue实例&#xff0c;在页面加载时…...

elasticsearch的高亮查询三种模式查询及可能存在的问题

目录 高亮查询使用介绍 高亮参数 三种分析器 可能存在的查询问题 fvh查询时出现StringIndexOutOfBoundsException越界 检索高亮不正确 参考文档 高亮查询使用介绍 Elasticsearch 的高亮&#xff08;highlight&#xff09;可以从搜索结果中的一个或多个字段中获取突出显…...

【精品实战项目】深度学习预测、深度强化学习优化、附源码数据手把手教学

目录 前言 一、预测算法数据与代码介绍(torch和mxnet都有) 1.1 数据介绍 1.2 代码介绍 1.3 优化介绍 二、深度强化学习算法优化 2.1 DDPG 介绍 DPG--deterministic policy gradient DQN--deep Q-network DDPG--deep deterministic policy gradient 三、其他算法 总结…...

JavaScript 手写仿深拷贝

实现对象参数的深拷贝并返回拷贝之后的新对象&#xff0c;因为参数对象和参数对象的每个数据项的数据类型范围仅在数组、普通对象&#xff08;{}&#xff09;、基本数据类型中且无需考虑循环引用问题&#xff0c;所以不需要做过多的数据类型判断&#xff0c;核心步骤有&#xf…...