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

常见算法和Lambda

常见算法和Lambda

文章目录

  • 常见算法和Lambda
    • 常见算法
      • 查找算法
        • 基本查找(顺序查找)
        • 二分查找/折半查找
        • 插值查找
        • 斐波那契查找
        • 分块查找
        • 扩展的分块查找(无规律的数据)
    • 常见排序算法
      • 冒泡排序
      • 选择排序
      • 插入排序
      • 快速排序
        • 递归
        • 快速排序
    • Arrays
    • Lambda表达式
      • 函数式编程

常见算法

查找算法

基本查找(顺序查找)

核心:从0索引开始挨个往后查找

  • 需求定义:一个方法利用基本查找,查找某个元素是否存在
  • 数据如下:{131,127,147,81,103,23,7,79}
package com.example.demo;public class Text{public static void main(String[] args) {int [] arr = {131,127,147,81,103,23,7,79};int number = 81;System.out.println(basicSearch(arr,number));}private static boolean basicSearch(int[] arr, int number) {for (int i = 0; i < arr.length; i++) {if(arr[i] == number){return true;}}return false;}
}
  • 需求:定义一个方法利用基本查找,查询某个元素在数组中的索引
  • 要求:不需要考虑数组中元素是否重复
package com.example.demo;public class Text{public static void main(String[] args) {int [] arr = {131,127,147,81,103,23,7,79};int number = 81;System.out.println(basicSearch(arr,number));}private static int basicSearch(int[] arr, int number) {for (int i = 0; i < arr.length; i++) {if(arr[i] == number){return i;}}return -1;}
}
  • 需求:定义一个方法利用基本查找,查询某个元素在数组中的索引
  • 要求:需要考虑数组中元素有重复的可能性
package com.example.demo;import java.util.ArrayList;public class Text{public static void main(String[] args) {int [] arr = {131,127,147,81,103,23,7,79,81};int number = 81;System.out.println(basicSearch(arr,number));}private static ArrayList<Integer> basicSearch(int[] arr, int number) {ArrayList<Integer> list = new ArrayList<>();for (int i = 0; i < arr.length; i++) {if(arr[i] == number){list.add(i);}}return list;}
}
二分查找/折半查找

前提条件:数组中的数据必须是有序的

核心思想:每次排除一半的查找范围

  • min和max表示当前要查找的范围
  • mid是在min和max中间的
  • 如果要查找的元素在mid的左边,缩小范围时,min不变,max等于mid减一
  • 如果要查找的元素在mid的右边,缩小范围,max不变,min等于mid加一
package com.example.demo;public class Text{public static void main(String[] args) {
//        需求:定义一个方法利用二分查找,查询某个元素在数组中的索引
//        数据如下:{7,23,79,81,103,127,131,147}int [] arr = {7,23,79,81,103,127,131,147};System.out.println(binarySearch(arr,131));}private static int binarySearch(int[] arr, int number) {
//       1.定义两个变量记录要查找的范围int min = 0;int max = arr.length-1;//        2.利用循环不断地去找要查找的数据while (true){if(min > max){return -1;}//            3.找到min和max的中间位置int mid = (min + max)/2;
//            4.拿着mid指向的元素跟要查找的元素进行比较if (arr[mid] > number){//4.1 number在mid的左边// min不变,max = min -1;max = mid - 1;}else if(arr[mid] < number){//4.2 number子啊mid的右边//max不变,min = mid + 1min = mid + 1;}else{//4.3 number跟mid指向的元素一样//找到了return mid;}}}
}

1720164211486

插值查找

数组中的值,分布比较均匀。

1720164511201

斐波那契查找

1720164773883

1720164896413

分块查找
  • 前一块中的最大数据,小于后一块中所有的数据(块内无序,块间有序)
  • 块数数量一般等于数字的个数开根号。比如:16个数字一般分为4块左右

核心思路:先确定要查找的元素在哪一块,然后在块内挨个查找。

package com.example.demo;public class Text{public static void main(String[] args) {int[] arr = {16,5,9,12,21,18,32,23,37,26,45,34,50,48,61,52,73,66};//创建三个的块对象Block b1 = new Block(21,0,5);Block b2 = new Block(45,6,11);Block b3 = new Block(73,12,17);//        定义数组用来管理三个块的对象(索引表)Block[] blockArr = {b1,b2,b3};//        定义一个变量用来记录要查找的元素int number = 30;//        调用方法,传递索引表,数组,要查找的元素int index = getIndex(blockArr,arr,number);//        打印System.out.println(index);}//    利用分块查找的原理,查询number的索引
//    1.确定number在索引表的位置private static int getIndex(Block[] blockArr, int[] arr, int number) {//1.确定number是在哪一块中的int indexBlock = findIndexBlock(blockArr,number);if(indexBlock == -1){//表示number不在数组当中return -1;}//        2.获取这一块的起始索引和结束索引int startIndex = blockArr[indexBlock].getStartIndex();int endIndex = blockArr[indexBlock].getEndIndex();//        3.遍历for (int i = startIndex; i <= endIndex; i++) {if(arr[i] == number){return i;}}return -1;}//    定义一个方法,用来确定number在哪一块public static int findIndexBlock(Block[] blockArr,int number){//从0索引开始遍历blockArr,如果number小于max,那么就表示number是在这一块当中的。for (int i = 0; i < blockArr.length; i++) {if(number <= blockArr[i].getMax()){return i;}}return -1;}}class Block{private int max;private int startIndex;private int endIndex;public Block() {}public Block(int max, int startIndex, int endIndex) {this.max = max;this.startIndex = startIndex;this.endIndex = endIndex;}public int getMax() {return max;}public void setMax(int max) {this.max = max;}public int getStartIndex() {return startIndex;}public void setStartIndex(int startIndex) {this.startIndex = startIndex;}public int getEndIndex() {return endIndex;}public void setEndIndex(int endIndex) {this.endIndex = endIndex;}@Overridepublic String toString() {return "Block{" +"max=" + max +", startIndex=" + startIndex +", endIndex=" + endIndex +'}';}
}
扩展的分块查找(无规律的数据)

1720168388226

package com.example.demo;public class Text{public static void main(String[] args) {int[] arr = {27,22,30,40,36,13,19,16,20,7,10,43,50,48};//创建三个的块对象Block b1 = new Block(22,40,0,4);Block b2 = new Block(13,20,5,8);Block b3 = new Block(7,10,9,10);Block b4 = new Block(43,50,11,13);//        定义数组用来管理三个块的对象(索引表)Block[] blockArr = {b1,b2,b3,b4};//        定义一个变量用来记录要查找的元素int number = 48;//        调用方法,传递索引表,数组,要查找的元素int index = getIndex(blockArr,arr,number);//        打印System.out.println(index);}//    利用分块查找的原理,查询number的索引
//    1.确定number在索引表的位置private static int getIndex(Block[] blockArr, int[] arr, int number) {//1.确定number是在哪一块中的int indexBlock = findIndexBlock(blockArr,number);if(indexBlock == -1){//表示number不在数组当中return -1;}//        2.获取这一块的起始索引和结束索引int startIndex = blockArr[indexBlock].getStartIndex();int endIndex = blockArr[indexBlock].getEndIndex();//        3.遍历for (int i = startIndex; i <= endIndex; i++) {if(arr[i] == number){return i;}}return -1;}//    定义一个方法,用来确定number在哪一块public static int findIndexBlock(Block[] blockArr,int number){//从0索引开始遍历blockArr,如果number小于max,大于min,那么就表示number是在这一块当中的。for (int i = 0;i < blockArr.length; i++) {if(number <= blockArr[i].getMax() && number >= blockArr[i].getMin()){return i;}}return -1;}}class Block{private int max;private int min;private int startIndex;private int endIndex;public Block() {}public Block(int min,int max, int startIndex, int endIndex) {this.min = min;this.max = max;this.startIndex = startIndex;this.endIndex = endIndex;}public int getMin() {return min;}public void setMin(int min) {this.min = min;}public int getMax() {return max;}public void setMax(int max) {this.max = max;}public int getStartIndex() {return startIndex;}public void setStartIndex(int startIndex) {this.startIndex = startIndex;}public int getEndIndex() {return endIndex;}public void setEndIndex(int endIndex) {this.endIndex = endIndex;}@Overridepublic String toString() {return "Block{" +"max=" + max +", min=" + min +", startIndex=" + startIndex +", endIndex=" + endIndex +'}';}
}

常见排序算法

冒泡排序

  • 相邻的数据两两比较,小的放前面,大的放后面。
  • 第一轮循环结束,最大值已经找到,在数组的最右边。第二轮可以少循环一次,后面以此类推。
  • 如果数组中有n个数据,总共我们只要执行n-1轮的代码就可以。
package com.example.demo;public class Text {public static void main(String[] args) {
//        1.定义数组int[] arr = {2,4,5,3,1};//        2.利用冒泡排序将数组的数据变成1,2,3,4,5
//        外循环:表示我要执行多少轮,如果有n个数据,那么执行n-1轮for (int i = 0; i < arr.length-1; i++) {
//            内循环:每一轮中我如何比较数据并找到当前的最大值//-1:为了防止索引越界//-i:提高效率,每一轮执行的次数应该比上一轮少一次。for (int j = 0; j < arr.length-1 - i; j++) {if(arr[j] > arr[j+1]){int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}for (int i = 0; i < arr.length; i++) {System.out.println(arr[i] + " ");}}
}

选择排序

  • 从0索引开始,拿着每一个索引上的元素跟后面的元素依次比较,小的放前面,大的放后面,以此类推。
  • 第一轮结束后,最小的数据已经确定
package com.example.demo;public class Text {public static void main(String[] args) {
//        1.定义数组int[] arr = {2, 4, 5, 3, 1};//        2.利用选择排序让数组变成1 2 3 4 5for (int i = 0; i < arr.length - 1; i++) {for (int j = i + 1; j < arr.length; j++) {if(arr[i] > arr[j]){int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}}for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}
}

插入排序

  • 将0索引的元素到N索引的元素看做是有序的,把N+1索引的元素到最后一个当成是无序的。
  • 遍历无序的数据,将遍历的元素插入有序序列中适当的位置,如遇到相同数据,插在后面。
  • N的范围:0~最大索引
package com.example.demo;public class Text {public static void main(String[] args) {
//        1.定义数组int[] arr = {3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};//        2.找到无序的那一组数组是从哪个索引开始的int startIndex= -1;for (int i = 0; i < arr.length; i++) {if(arr[i] > arr[i+1] ){startIndex = i + 1;break;}}//        3.遍历从startIndex开始到最后一个元素,依次得到无序的那一组数据中的每一个元素for (int i = startIndex; i < arr.length; i++) {
//            记录当前要插入数据的索引int j = i;while (j > 0 && arr[j] < arr[j-1]){
//                交换位置int temp = arr[j];arr[j] = arr[j-1];arr[j-1] = temp;j--;}}for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}
}

快速排序

递归

方法中调用方法本身的现象

注意点:递归一定要有出口,否则就会出现内存溢出

作用:把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解

递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算

package com.example.demo;public class Text {public static void main(String[] args) {//求1~100之间的和System.out.println(getSum(100));}public static int getSum(int number){if(number == 1){return 1;}//        如果number不是1?return number + getSum(number-1);}
}
package com.example.demo;public class Text {//求5的阶乘public static void main(String[] args) {System.out.println(getFactorial(5));}public static int getFactorial(int number){if(number == 1){return 1;}
//        如果number不是1?return number * getFactorial(number-1);}
}
快速排序

第一轮:把0索引的数字作为基准数,确定基准数在数组中正确的位置。

比基准数小的全部在左边,比基准数大的全部在右边。

package com.example.demo;public class Text {public static void main(String[] args) {int[] arr = {6,1,2,7,9,3,4,5,10,8};quickSort(arr,0,arr.length-1);for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}public static void quickSort(int[] arr,int i,int j){
//        定义两个变量记录要查找的范围int start= i;int end = j;if(start > end){return;}//        记录基准数int baseNumber = arr[i];
//        利用循环找到要交换的数字while (start != end) {
//            利用end,从后往前开始找,找比基准数小的数字while (true){if(end <= start || arr[end] < baseNumber){break;}end--;}
//            利用start,从前往后找,找比基准数大的数字while (true){if(end <= start || arr[start] > baseNumber){break;}start++;}
//            把end和start指向的元素进行交换int temp = arr[start];arr[start] = arr[end];arr[end] = temp;}
//    当start和end直系那个了同一个元素的时候,那么上面的循环就会结束
//    表示已经找到了基准数在数组中应存入的位置
//    基准数归位int temp = arr[i];arr[i] = arr[start];arr[start] = temp;//        确定6左边的范围,重复刚刚所做的事情quickSort(arr,i,start-1);
//        确定6右边的范围,重复刚刚所做的事情quickSort(arr,start+1,j);}}

1720173652777

Arrays

操作数组的工具类

1720174919002

1720175136896

1720175208004

1720175250562

1720175475272

1720175524323

1720175695912

1720175851349

Lambda表达式

函数式编程

是一种思想特点。函数式编程思想忽略面向对象的复杂语法,强调做什么,而不是谁去做。

1720176866498

1720176984576

1720177474422
1720177720800

相关文章:

常见算法和Lambda

常见算法和Lambda 文章目录 常见算法和Lambda常见算法查找算法基本查找&#xff08;顺序查找&#xff09;二分查找/折半查找插值查找斐波那契查找分块查找扩展的分块查找&#xff08;无规律的数据&#xff09; 常见排序算法冒泡排序选择排序插入排序快速排序递归快速排序 Array…...

自动缩放 win7 远程桌面

https://mremoteng.org/download 用这个软件&#xff0c;下载 zip 版&#xff0c;不需要管理员权限 在这里找到的&#xff0c;选票最高的一个就是 https://superuser.com/questions/1030041/remote-desktop-zoom-and-full-screen-how-win10-remote-win7-2008-2003-ho...

微机原理与单片机 知识体系梳理

单片机笔记分享 我个人感觉单片机要记的东西很多&#xff0c;也很琐碎&#xff0c;特别是一些位、寄存器以及相关作用等&#xff0c;非常难以记忆。因此复习时将知识点整理在了一起做成思维导图&#xff0c;希望对大家有所帮助。内容不是很多&#xff0c;可能有些没覆盖全&…...

低音炮内存卡格式化后无法播放音乐文件

试了多次 不支持ntfs不支持exfat 仅支持fat32 FAT32与exFAT的区别主要体现在来源、单个文件限制、适用情况以及兼容性方面。12 来源&#xff1a; FAT32是Windows平台的传统文件格式&#xff0c;首次在Windows 95第二版中引入&#xff0c;旨在取代FAT16&#xff0c;具有良好的…...

手动将dingtalk-sdk-java jar包打入maven本地仓库

有时候,中央镜像库不一定有自己需要的jar包,这时候我们就需要用到该方法,将jar打入maven本地仓库,然后项目中,正常使用maven的引入规则。 mvn install:install-file -Dmaven.repo.local=D:\software\maven\apache-maven-3.6.3-bin\apache-maven-3.6.3\repo -DgroupId=ding…...

C++:构造函数是什么东西

一、构造函数是什么 在C中&#xff0c;构造函数是一种特殊成员函数&#xff0c;它有一下几个明显的特征&#xff1a; 1、它自动在创建新对象时被调用。 2、其名称与类名相同&#xff0c; 3、没有返回类型&#xff0c; 4、通常没有参数&#xff08;除了默认情况下的隐式thi…...

工作两年后,我如何看待设计模式

在软件工程中&#xff0c;设计模式是经过反复验证的最佳实践&#xff0c;用于解决在软件设计中经常遇到的一类问题。它们为开发者提供了一种通用的解决方案和语言&#xff0c;使得复杂的编程问题得以简化&#xff0c;代码结构更加清晰&#xff0c;可维护性大大提高。简而言之&a…...

01 Web基础与HTTP协议

1、域名和DNS 1.1 域名的概念 如果说一个主机&#xff0c;没有名字也可以完全用IP来代替&#xff0c;但是IP地址不好记忆。例如说&#xff0c;我们记一些网站的名称百度、新浪、搜狐等很好记&#xff0c;但是如果要去记百度的IP、新浪的IP、以及搜狐的IP地址&#xff0c;那将会…...

Java求自然常数e的近似值(课堂实例1)

❤❤引言&#x1f383;&#x1f383; ❤点关注编程梦想家&#xff08;大学生版&#xff09;-CSDN博客不迷路~~~~~~❤ 自然常数 &#x1d452;e 是数学中一个非常重要的常数&#xff0c;约等于 2.71828&#xff0c;它在自然对数、复合利息计算等领域有着广泛的应用。本文将介绍如…...

简过网:什么是咨询工程师?我不允许还有人不知道!

咨询工程师真的有必要考吗&#xff1f;近期小编收到很多关于咨询工程师的的问题&#xff0c;今天&#xff0c;小编给大家整理汇总了一下关于咨询工程师的相关问题&#xff0c;希望能够帮助到大家&#xff01; 一、什么是咨询工程师&#xff1f; 咨询工程师是从事工程咨…...

数据泄露时代的安全之道:访问认证的重要性

引言 想象一下&#xff1a;你一觉醒来&#xff0c;收到一条通知——你的公司遭遇了数据泄露。你感到恐惧&#xff0c;因为这意味着客户数据被曝光&#xff0c;公司声誉受损&#xff0c;还有巨额罚款在等着你。在当今的数字化环境中&#xff0c;这种情况太常见了。全球各地的组…...

XLSX + LuckySheet + LuckyExcel + Web Worker实现前端的excel预览

文章目录 功能简介简单代码实现web worker 版本效果参考 功能简介 通过LuckyExcel的transformExcelToLucky方法&#xff0c; 我们可以把一个文件直接转成LuckySheet需要的json字符串&#xff0c; 之后我们就可以用LuckySheet预览excelLuckyExcel只能解析xlsx格式的excel文件&a…...

Java版本迭代的过程(Java面经)

Java 5: 泛型与注解 泛型&#xff1a;使得Web应用可以编写更加类型安全的代码&#xff0c;特别是在处理各种数据结构时&#xff0c;如集合框架的使用。注解&#xff1a;极大地简化了配置管理&#xff0c;Spring框架的崛起得益于Java 5的注解支持&#xff0c;使得依赖注入和AOP…...

深入了解java锁升级可以应对各种疑难问题

对于java锁升级&#xff0c;很多人都停留在比较浅层的表面理解&#xff0c;一定程度下也许够用&#xff0c;但如果学习其中的细节&#xff0c;我们更好地理解多线程并发时各种疑难问题的应对方式&#xff01; 因此我将锁升级过程中可能涉及的大部分细节或者疑问都整合成了一篇…...

C++初学者指南-4.诊断---基础:警告和测试

C初学者指南-4.诊断—基础知识&#xff1a;警告和测试 文章目录 C初学者指南-4.诊断---基础知识&#xff1a;警告和测试1. 术语和技术记住&#xff1a;使用专用类型&#xff01; 2.编译器警告Gcc/CLang 编译器选项MS Visual Studio 编译器选项 3.断言运行时断言静态断言&#x…...

docker使用镜像jms_all部署jumpserver

创建容器需要挂载出来的服务器对应目录 mkdir -p /data/redis/data mkdir -p /opt/mysql/{data,conf,logs}docker安装redis docker run -d -it --name redis -p 6379:6379 -v /data/redis/data:/data --restart=always...

在Java项目中集成单元测试与覆盖率工具

在Java项目中集成单元测试与覆盖率工具 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 单元测试是软件开发中至关重要的一环&#xff0c;它用于验证代码在独立…...

CTF实战:从入门到提升

CTF实战&#xff1a;从入门到提升 &#x1f680;前言 没有网络安全就没有国家安全&#xff0c;网络安全不仅关系到国家整体信息安全&#xff0c;也关系到民生安全。近年来&#xff0c;随着全国各行各业信息化的发展&#xff0c;网络与信息安全得到了进一步重视&#xff0c;越…...

Spring Boot集成olingo快速入门demo

1.什么是olingo&#xff1f; Apache Olingo 是个 Java 库&#xff0c;用来实现 Open Data Protocol (OData)。 Apache Olingo 包括服务客户端和 OData 服务器方面。 Open Data Protocol &#xff08;开放数据协议&#xff0c;OData&#xff09; 是用来查询和更新数据的一种W…...

GPT对话代码库——HAL库下 USART 的配置及问题(STM32G431CBT6)

目录 1&#xff0c;问&#xff1a; 1&#xff0c;答&#xff1a; 示例代码 正确的HAL库初始化方式 自定义初始化方式&#xff08;不推荐&#xff09; 总结 2&#xff0c;问&#xff1a; 2&#xff0c;答&#xff1a; 代码详细解释 初始部分 主初始化部分 初始化调用…...

top50 BF16算力(TFLOPS) 显卡排行榜 天梯图

排名显卡型号BF16算力(TFLOPS)售价(元)单TFLOPS价格(元)1B200(SXM)45002200000488.892H200(SXM)19801200000606.063MI300X1307750000573.834H100 SXM519501100000564.105RTX PRO 6000 Blackwell1150780000678.266H100 PCIe 80GB1560850000544.877RTX 50906803400050.008A100 80…...

硬件答辩问题总结

一、电源纹波是什么&#xff0c;为什么LDO的小&#xff0c;DCDC的大1.电源纹波电源纹波 是指直流电源输出电压上叠加的 交流波动成分&#xff0c;表现为电压在理想直流值附近上下波动。2.LDO 纹波小原理LDO 内部是一个 调整管&#xff08;可变电阻&#xff09; 串联在输入和输出…...

Unity主题系统设计:状态驱动的主题抽象与自动注入方案

1. 这不是换个颜色那么简单&#xff1a;为什么Unity项目里“换肤”总在发布前夜崩盘&#xff1f;你有没有经历过这样的场景&#xff1a;美术同学凌晨两点发来一套新主题资源包&#xff0c;UI设计师说“这次配色更符合品牌调性”&#xff0c;产品说“上线前必须支持深色模式”&a…...

风控系统如何全维度识别爬虫:IP、账号与行为的协同决策机制

1. 这不是“反爬失败”&#xff0c;而是风控系统在对你做全维度画像你写完一段 requests BeautifulSoup 的代码&#xff0c;本地跑通了&#xff0c;开开心心部署到服务器&#xff0c;结果第二天早上发现&#xff1a;所有请求返回 403&#xff0c;日志里全是空响应&#xff1b;…...

3步掌握OpenSpeedy:免费开源游戏加速工具使用指南

3步掌握OpenSpeedy&#xff1a;免费开源游戏加速工具使用指南 【免费下载链接】OpenSpeedy &#x1f3ae; An open-source game speed modifier. 项目地址: https://gitcode.com/gh_mirrors/op/OpenSpeedy 你是否曾为游戏卡顿而烦恼&#xff1f;是否希望在单机游戏中加快…...

别再手动改代码了!用Vivado的VIO IP核实时调试你的FPGA设计(附UART实例)

实时交互式FPGA调试革命&#xff1a;Vivado VIO核的UART实战指南 调试FPGA设计时&#xff0c;你是否经历过这样的痛苦循环&#xff1a;修改一行代码→全编译→下载比特流→测试→发现问题→再修改...这种"石器时代"的工作流正在吞噬工程师的创造力。Xilinx Vivado中的…...

3个核心问题:如何突破Cursor AI的使用限制并持续获得Pro功能体验?

3个核心问题&#xff1a;如何突破Cursor AI的使用限制并持续获得Pro功能体验&#xff1f; 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: …...

STM32G431实战:拆解蓝桥杯嵌入式‘分任务’调度核心,让你的代码像RTOS一样清晰

STM32G431实战&#xff1a;构建轻量级时间片轮询调度框架 在嵌入式开发中&#xff0c;尤其是资源受限的竞赛平台如蓝桥杯嵌入式赛道&#xff0c;如何高效管理多个外设任务是一个常见挑战。传统的while(1)轮询方式会导致代码臃肿且难以维护&#xff0c;而完整RTOS又可能超出硬件…...

5分钟快速解锁中兴光猫:终极免费工具zteOnu完整指南

5分钟快速解锁中兴光猫&#xff1a;终极免费工具zteOnu完整指南 【免费下载链接】zteOnu A tool that can open ZTE onu device factory mode 项目地址: https://gitcode.com/gh_mirrors/zt/zteOnu 对于网络管理员和技术爱好者来说&#xff0c;中兴光猫的权限限制常常成…...

2026国安部重磅披露:境外间谍如何利用民用路由器构建窃密跳板?全链路技术解析与防御指南

一、引言&#xff1a;从"网速变慢"到国家级网络窃密 2026年5月20日&#xff0c;国家安全部官方微信公众号发布紧急通报&#xff0c;披露了一起严重的境外间谍情报机关网络窃密案件。与以往直接攻击政府或企业服务器不同&#xff0c;此次攻击者将目标锁定在了最容易被…...