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

【算法刷题之字符串篇】

目录

  • 1.leetcode-344. 反转字符串
    • (1)方法:双指针
  • 2.leetcode-541. 反转字符串 II
    • (1)方法一:模拟
    • (2)方法二:双指针
  • 3.leetcode-剑指 Offer 05. 替换空格
    • (1)方法一:遍历字符串
    • (2)方法二:数组填充
  • 4.leetcode-151. 反转字符串中的单词
    • (1)方法一:栈模拟
    • (2)方法二:双指针
  • 5.leetcode-剑指 Offer 58 - II. 左旋转字符串
    • (1)方法一:模拟
    • (2)方法二:string函数
  • 6.leetcode-459. 重复的子字符串
    • (1)方法一:枚举
    • (2)方法二:字符串匹配

1.leetcode-344. 反转字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
在这里插入图片描述

(1)方法:双指针

1.将 left 指向字符数组首元素,right 指向字符数组尾元素。

2.当 left < right:

交换 s[left] 和 s[right];

3.left 指针右移一位,即 left = left + 1;

4.right 指针左移一位,即 right = right - 1。

5.当 left >= right,反转结束,返回字符数组即可。
在这里插入图片描述

class Solution {
public:void reverseString(vector<char>& s) {int end=s.size()-1;int prev=0;while(prev<end){swap(s[prev],s[end]);prev++;end--;}}
};

2.leetcode-541. 反转字符串 II

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
在这里插入图片描述

(1)方法一:模拟

我们直接按题意进行模拟:反转每个下标从 2k 的倍数开始的,长度为 k 的子串。若该子串长度不足 k,则反转整个子串。

class Solution {
public:string reverseStr(string s, int k) {int n = s.length();for (int i = 0; i < n; i += 2 * k) {reverse(s.begin() + i, s.begin() + min(i + k, n));}return s;}
};

(2)方法二:双指针

class Solution {
public:void reverse1(string& s,int i,int j){int prev=i;int end=j;while(prev<end){swap(s[prev],s[end]);prev++;end--;}}string reverseStr(string s, int k) {int n=s.size();for (int i = 0; i < s.size(); i += 2 * k){int mini=min(i+k-1,n-1);reverse1(s,i,mini);}return s;}
};

3.leetcode-剑指 Offer 05. 替换空格

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
在这里插入图片描述

(1)方法一:遍历字符串

1.创建一个空字符串ans,用于存储替换空格字符后的结果。

2.对于字符串s中的每个字符a,进行以下判断:

3.如果字符a是空格字符(即a==’ '),则在ans字符串中依次添加字符 ‘%’、‘2’、‘0’。这相当于用"%20"来替换每个空格字符。

4.如果字符a不是空格字符,则直接将字符a添加到ans字符串中。

5.循环结束后,将得到的ans字符串作为结果进行返回。

class Solution {
public:string replaceSpace(string s) {string ans;for(auto& a:s){if(a==' '){ans.push_back('%');ans.push_back('2');ans.push_back('0');}else{ans.push_back(a);}}return ans;}
};

(2)方法二:数组填充

如果想把这道题目做到极致,就不要只用额外的辅助空间了!

首先扩充数组到每个空格替换成"%20"之后的大小。

然后从后向前替换空格,也就是双指针法,过程如下:

i指向新长度的末尾,j指向旧长度的末尾。

class Solution {
public:string replaceSpace(string s) {int count = 0; // 统计空格的个数int sOldSize = s.size();for (int i = 0; i < s.size(); i++) {if (s[i] == ' ') {count++;}}// 扩充字符串s的大小,也就是每个空格替换成"%20"之后的大小s.resize(s.size() + count * 2);int sNewSize = s.size();// 从后先前将空格替换为"%20"for (int i = sNewSize - 1, j = sOldSize - 1; j < i; i--, j--) {if (s[j] != ' ') {s[i] = s[j];} else {s[i] = '0';s[i - 1] = '2';s[i - 2] = '%';i -= 2;}}return s;}
};

4.leetcode-151. 反转字符串中的单词

给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
在这里插入图片描述

(1)方法一:栈模拟

1.创建一个栈 s1 用于存储每个单词。

2.创建一个空字符串 word 用于暂存每个单词。

3.创建一个空字符串 result 用于存储最终的翻转结果。

4.对于字符串s中的每个字符a,进行以下判断:

*如果字符a不是空格字符(即a != ’ '),说明当前字符属于一个单词的一部分,则将其添加到 word 字符串中。

*如果字符a是空格字符,并且 word 字符串非空,说明一个完整单词结束了,将 word 字符串压入栈 s1 中,并重置 word 为空字符串。

*如果循环结束后,word 不为空,说明最后一个单词还未压入栈中,所以将它压入栈 s1 中。

5.当栈 s1 非空时,依次将栈顶的单词弹出并添加到 result 字符串的末尾,并附加一个空格。

6.如果 result 非空,那么最后一个字符是多余的空格,所以将它从 result 中移除。

7.将最终的结果 result 返回。

class Solution {
public:string reverseWords(string s) {stack<string> s1;string word;string result;for(auto& a:s){if(a!=' '){word+=a;}else if(a==' '&&!word.empty()){s1.push(word);word="";}}if(!word.empty()){s1.push(word);}while(!s1.empty()){result+=s1.top()+' ';s1.pop();}if(!result.empty()){result.pop_back();}return result;}
};

(2)方法二:双指针

使用双指针法来去移除空格,最后resize(重新设置)一下字符串的大小,就可以做到O(n)的时间复杂度。

void removeExtraSpaces(string& s) {int slowIndex = 0, fastIndex = 0; // 定义快指针,慢指针// 去掉字符串前面的空格while (s.size() > 0 && fastIndex < s.size() && s[fastIndex] == ' ') {fastIndex++;}for (; fastIndex < s.size(); fastIndex++) {// 去掉字符串中间部分的冗余空格if (fastIndex - 1 > 0&& s[fastIndex - 1] == s[fastIndex]&& s[fastIndex] == ' ') {continue;} else {s[slowIndex++] = s[fastIndex];}}if (slowIndex - 1 > 0 && s[slowIndex - 1] == ' ') { // 去掉字符串末尾的空格s.resize(slowIndex - 1);} else {s.resize(slowIndex); // 重新设置字符串大小}
}

有的同学可能发现用erase来移除空格,在leetcode上性能也还行。主要是以下几点;:

leetcode上的测试集里,字符串的长度不够长,如果足够长,性能差距会非常明显。
leetcode的测程序耗时不是很准确的。
版本一的代码是一般的思考过程,就是 先移除字符串前的空格,再移除中间的,再移除后面部分。

不过其实还可以优化,这部分和27.移除元素 (opens new window)的逻辑是一样一样的,本题是移除空格,而 27.移除元素 就是移除元素。

所以代码可以写的很精简,大家可以看 如下 代码 removeExtraSpaces 函数的实现:

// 版本二 
void removeExtraSpaces(string& s) {//去除所有空格并在相邻单词之间添加空格, 快慢指针。int slow = 0;   //整体思想参考https://programmercarl.com/0027.移除元素.htmlfor (int i = 0; i < s.size(); ++i) { //if (s[i] != ' ') { //遇到非空格就处理,即删除所有空格。if (slow != 0) s[slow++] = ' '; //手动控制空格,给单词之间添加空格。slow != 0说明不是第一个单词,需要在单词前添加空格。while (i < s.size() && s[i] != ' ') { //补上该单词,遇到空格说明单词结束。s[slow++] = s[i++];}}}s.resize(slow); //slow的大小即为去除多余空格后的大小。
}

还要实现反转字符串的功能,支持反转字符串子区间,这个实现我们分别在344.反转字符串 (opens new window)和541.反转字符串II (opens new window)里已经讲过了。

代码如下:

// 反转字符串s中左闭右闭的区间[start, end]
void reverse(string& s, int start, int end) {for (int i = start, j = end; i < j; i++, j--) {swap(s[i], s[j]);}
}

整体代码如下:

class Solution {
public:void reverse(string& s, int start, int end){ //翻转,区间写法:左闭右闭 []for (int i = start, j = end; i < j; i++, j--) {swap(s[i], s[j]);}}void removeExtraSpaces(string& s) {//去除所有空格并在相邻单词之间添加空格, 快慢指针。int slow = 0;   //整体思想参考https://programmercarl.com/0027.移除元素.htmlfor (int i = 0; i < s.size(); ++i) { //if (s[i] != ' ') { //遇到非空格就处理,即删除所有空格。if (slow != 0) s[slow++] = ' '; //手动控制空格,给单词之间添加空格。slow != 0说明不是第一个单词,需要在单词前添加空格。while (i < s.size() && s[i] != ' ') { //补上该单词,遇到空格说明单词结束。s[slow++] = s[i++];}}}s.resize(slow); //slow的大小即为去除多余空格后的大小。}string reverseWords(string s) {removeExtraSpaces(s); //去除多余空格,保证单词之间之只有一个空格,且字符串首尾没空格。reverse(s, 0, s.size() - 1);int start = 0; //removeExtraSpaces后保证第一个单词的开始下标一定是0。for (int i = 0; i <= s.size(); ++i) {if (i == s.size() || s[i] == ' ') { //到达空格或者串尾,说明一个单词结束。进行翻转。reverse(s, start, i - 1); //翻转,注意是左闭右闭 []的翻转。start = i + 1; //更新下一个单词的开始下标start}}return s;}
};

5.leetcode-剑指 Offer 58 - II. 左旋转字符串

字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
在这里插入图片描述

(1)方法一:模拟

在这里插入图片描述

class Solution {
public:string reverseLeftWords(string s, int n) {reverse(s.begin(), s.begin() + n);reverse(s.begin() + n, s.end());reverse(s.begin(), s.end());return s;}
};

(2)方法二:string函数

class Solution {
public:string reverseLeftWords(string s, int n) {s.append(s.substr(0,n));s.erase(s.begin(),s.begin()+n);return s;}
};

6.leetcode-459. 重复的子字符串

给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。
在这里插入图片描述

(1)方法一:枚举

1.首先获取字符串s的长度,用变量n表示。

2.通过遍历的方式尝试找到可能的重复子字符串的长度。从1开始遍历到n的一半(i*2<=n),以保证子字符串的长度不超过原字符串的一半。

3.当找到一个可能的重复子字符串长度i后,判断原字符串是否可以被i整除(即n%i==0),如果可以整除,则继续判断是否存在重复子字符串的情况。

4.进入内层循环,从第i个字符开始遍历到字符串末尾。对于每个位置 j,检查当前位置字符s[j]是否与距离i个位置之前的字符s[j-i]相等,如果不相等,则说明不是重复子字符串。

5.如果内层循环完全遍历,并且没有发现不匹配的情况,则标记变量match为true,表示存在重复子字符串,并立即返回true。

6.如果外层循环结束,仍没有返回true,则说明不存在重复子字符串,返回false。

class Solution {
public:bool repeatedSubstringPattern(string s) {int n=s.size();for(int i=1;i*2<=n;++i){if(n%i==0){bool match=true;for(int j=i;j<n;++j){if(s[j]!=s[j-i]){match=false;break;}}if(match){return true;}}}return false;}
};

(2)方法二:字符串匹配

1.将原字符串s与自身进行拼接,得到一个新的字符串。例如,如果s是"abc",那么(s + s)的结果是"abcabc"。

2.使用字符串的find函数来在拼接后的字符串中查找原字符串s的第一个出现位置。函数的参数为要查找的子字符串s和搜索起始位置为1(即从第二个字符开始搜索)。

3.将查找结果与原字符串s的大小进行比较。如果二者相等,表示在拼接后的字符串中,只有一个出现位置,即没有重复的子字符串。如果不相等,表示在拼接后的字符串中存在多个子字符串的出现位置,即存在重复的子字符串。

4.根据比较结果,如果存在重复的子字符串,则返回true;否则,返回false。

class Solution {
public:bool repeatedSubstringPattern(string s) {return (s + s).find(s, 1) != s.size();}
};

相关文章:

【算法刷题之字符串篇】

目录 1.leetcode-344. 反转字符串&#xff08;1&#xff09;方法&#xff1a;双指针 2.leetcode-541. 反转字符串 II&#xff08;1&#xff09;方法一&#xff1a;模拟&#xff08;2&#xff09;方法二&#xff1a;双指针 3.leetcode-剑指 Offer 05. 替换空格&#xff08;1&…...

js中forEach和map的区别:forEach不会改变原数组,而map会改变数组?错了错了

1.提出思考&#xff1f;forEach不会改变原数组&#xff0c;而map会改变数组&#xff1f; 看到掘金上一篇文章觉得很有意思&#xff1a;大致是描述一般面试官问js中forEach和map的区别&#xff1f;都会回答forEach不会改变原数组&#xff0c;而map会改变&#xff0c;我也一直对…...

深度对话:从底层看Sui设计理念及网络规模扩展

近日&#xff0c;我们采访了George Danezis以了解Sui的交易处理系统如何促成高性能网络。他是Mysten Labs的联合创始人和首席科学家&#xff08;Sui的最初贡献者&#xff09;&#xff0c;也是伦敦大学学院&#xff08;University College London&#xff0c;UCL&#xff09;安全…...

2.单链表练习

1. 链表的基本概念 链表&#xff08;Linked List&#xff09;是一种常见的数据结构&#xff0c;用于存储一系列元素&#xff0c;这些元素可以是任意类型的数据。链表中的每个元素被称为节点&#xff08;Node&#xff09;&#xff0c;每个节点包含两部分&#xff1a;一个存储数…...

Wordpress 安装插件和主题报错

安装主题和插件的时候&#xff0c;就是这个恶心的报错&#xff0c; Wordpress plugin install: Could not create directory 这是权限惹的祸&#xff0c;如下一顿操作猛如虎&#xff0c;就解决了。 sudo chown -R www:www wp-content/themes sudo chown -R www:www wp-conte…...

Spring Cloud 2022.x版本使用gateway和nacos实现动态路由和负载均衡

文章目录 1、nacos下载安装1.1、启动服务器1.2、关闭服务器1.3、服务注册&发现和配置管理接口 2、代码示例2.1、app1工程代码2.2、app2工程代码2.3、gateway网关工程代码 3、动态配置网关路由3.1、配置动态路由3.2、配置为负载模式 4、gateway配置规则4.1、请求转发&#x…...

CSS中如何隐藏元素但保留其占位空间(display:none vs visibility:hidden)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ display: none;⭐ visibility: hidden;⭐ 如何选择⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为…...

无涯教程-机器学习 - 数据可视化

在上一章中&#xff0c;无涯教程讨论了数据对于机器学习算法的重要性&#xff0c;以了解具有统计信息的数据&#xff0c;还有另一种称为可视化的方式来理解数据。 借助数据可视化&#xff0c;可以看到数据的属性保持什么样的关联&#xff0c;这是查看要素是否与输出相对应的最…...

springboot设置日志输出级别

一、日志等级 trace&#xff1a;最低等级 debug&#xff1a;调试用&#xff0c;通常用于跟踪程序进展 info: 记录用&#xff0c;通常用于记录程序行为 warn&#xff1a;警告 error&#xff1a;错误 fatal&#xff1a;灾难性错误&#xff0c;最高等级 配置application.yml 实现…...

buildAdmin的使用笔记

安装buildAdmin 下载完整包&#xff0c;解压进入 buildadmin 的文件夹&#xff0c; 输入命令 composer install 启动的时候使用&#xff0c; php think run 就可以了 为什么启动只需要&#xff0c; php think run 这种启动方式&#xff0c; 我是头一回看见 &#xff0c;后来才…...

RealVNC配置自定义分辨率(AlmaLinux 8)

RealVNC 配置自定义分辨率&#xff08;AlmaLinux8&#xff09; 参考RealVNC官网 how to set up resolution https://help.realvnc.com/hc/en-us/articles/360016058212-How-do-I-adjust-the-screen-resolution-of-a-virtual-desktop-under-Linux-#standard-dummy-driver-0-2 …...

LA@特征值和特征向量的性质

文章目录 方阵特征值和特征向量的性质&#x1f47a;特征值之和特征值之积推论:特征值判定方阵的可逆性 证明小结 导出性质可逆矩阵的特征值性质转置矩阵和特征值矩阵多项式的特征值不同特征值的特征向量线性无关定理推论推广 特征向量线性组合特征值的重数性质 方阵特征值和特征…...

Springboot使用kafka事务-生产者方

前言 在上一篇文章中&#xff0c;我们使用了springboot的AOP功能实现了kafka的分布式事务&#xff0c;但是那样实现的kafka事务是不完美的&#xff0c;因为请求进来之后分配的是不同线程&#xff0c;但不同线程使用的kafka事务却是同一个&#xff0c;这样会造成多请求情况下的…...

您的计算机已被.halo勒索病毒感染?恢复您的数据的方法在这里!

导言&#xff1a; 在当今数字时代&#xff0c;网络安全已经成为了我们生活和工作中不可或缺的一部分。然而&#xff0c; .Halo 勒索病毒的出现&#xff0c;使网络威胁变得更加真切和具体。本文91数据恢复将深入介绍 .Halo 勒索病毒的危害&#xff0c;详细探讨如何高效地恢复被其…...

生成式AI颠覆传统数据库的十种方式

对于生成式AI的所有闪光点&#xff0c;这个新时代最大的转变可能深埋在软件堆栈中。AI算法正在不易觉察地改变一个又一个数据库。他们正在用复杂、自适应且看似更直观的AI新功能颠覆传统数据库。 与此同时&#xff0c;数据库制造商正在改变我们存储信息的方式&#xff0c;以便…...

el-date-picker自定义只能选中当前月份和半年内月份等

需求&#xff1a;el-date-picker只能选中当前月期和当前月期往前半年&#xff0c;其他时间就禁用了不让选择了&#xff0c;因为没数据哈哈。当然也可以选择往前一年等。 一、效果 二、写个日期选择器 :picker-options&#xff1a;日期选项 value-format&#xff1a;选择后的格…...

Pyecharts教程(十一):使用Pyecharts绘制带有滑动数据缩放功能的K线图

Pyecharts教程(十一):使用Pyecharts绘制带有滑动数据缩放功能的K线图 作者:安静到无声 个人主页 目录 Pyecharts教程(十一):使用Pyecharts绘制带有滑动数据缩放功能的K线图前言步骤总结推荐专栏前言 K线图是金融市场分析中常见的图表类型之一,它能够直观地展示价格的变化…...

2023年高教社杯数学建模思路 - 案例:ID3-决策树分类算法

文章目录 0 赛题思路1 算法介绍2 FP树表示法3 构建FP树4 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法&#xff0c;就是频繁模…...

POJ 3273 Monthly Expense 二分

我们对每个月花费的最小花费进行二分&#xff0c;对于每一次二分的值mid&#xff0c;计算能花的月份数量&#xff0c;如果月份数量小于等于m&#xff0c;我们就不断的缩小mid&#xff0c;直到找到月份数量小于等于m 与 月份数量大于m的临界值&#xff0c;取最后一次满足条件的m…...

图论(基础)

知识&#xff1a; 顶点&#xff0c;边 | 权&#xff0c;度数 1.图的种类&#xff1a; 有向图 | 无向图 有环 | 无环 联通性 基础1&#xff1a;图的存储&#xff08;主要是邻接矩阵和邻接表&#xff09; 例一&#xff1a;B3643 图的存储 - 洛谷 | 计算机科学教育新生态 (…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...