力扣刷题日志-Day2 (力扣151、43、14)

151. 反转字符串中的单词 

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

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

思路:根据题目大意,空格之间的就是一个单词,所以我们需要利用双指针定位空格,将空格之间的元素存入数组之中,然后倒序输出 ,进行输出。但进一步思考,我们不防直接从后面遍历,倒序输入然后正序输出,从而实现倒序。另外,看例题知空格不一定是一个,也可能是多个,位置也可能在开头和结尾,所以我们需要去空格。以上,得到大体步骤

  1. 倒序遍历字符串 s,记录单词左右索引边界 fast,solw 。
    int fast= s.size() - 1;
    int solw= s.size() - 1;
  2. 去空格
     while(fast >= 0 && s[fast] == ' ') fast--;
  3. 每确定一个单词的边界,则将其添加至单词列表 res ,并加入一个空格。
    solw = fast;//solw是后面的界限,每次过完空格开始的时候就是fast的位置
    while( fast >= 0 && s[fast] != ' ') fast--;//不是空格fast就不断往前
    res.append(s.substr(fast+1, solw-fast));//将单词加入到res中//s.substr(fast+1, solw-fast);
    字符串切割,此时s[fast] ==“ ”;所以单词范围应该在[fast+1,slow],
    因为substr的第二参数为长度,所以len=solw-(fast+1)+1;
  4. 最终,返回res

全部代码:

class Solution {//一、双指针(倒序遍历 + 分割)不需要删除头尾多余的空格
public:string reverseWords(string s) {string res = "";int fast= s.size() - 1;int solw= s.size() - 1;while(fast >= 0){while(fast >= 0 && s[fast] == ' ') fast--;//去掉单词后面的空格solw = fast;while( fast >= 0 && s[fast] != ' ') fast--;res.append(s.substr(fast+1, solw-fast));//正常来说单词后 都要加空格。不加空格的情况:字符串首字符为空格 且 遍历到 i<0;if(fast >= 0 || s[0] != ' ')  res += " ";  }//去掉尾部的一个多余空格res = res.substr(0, res.size()-1);return res;}
};

知识点补充:

字符串函数s.substr();

在C ++中,substrsubstr();是用于字符串处理的预定义函数。string.h是字符串函数所需的头文件。

此函数将两个值poslen作为参数,并返回一个新构造的字符串对象,其值初始化为该对象的子字符串的副本。从pos开始复制字符串,直到pos + len表示[pos,pos + len)为止。

 用法如下:

#include<string>
string s;
s.substr (pos,len);

pos表示要截取的子字符串的起始位置,len表示要截取的子字符串的长度。

43. 字符串相乘

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

大体思路:取出字符串里的数据,转化为int类型,模拟乘法即可。

取数据:

// 将 num1、num2 分别存入 A、B 中for (int i = 0; i < len1; i++) {A.push_back(num1[i] - '0');}for (int i = 0; i < len2; i++) {B.push_back(num2[i] - '0');}

方法一:尝试直接用int类型进行转换。但是int限制不够,long也不够(利用数组吧)

这个也稍微讲一下,范围内这个方法也不错

    long  res=0,sum=0;  for(int i=0;i<num2.size();i++){//模拟竖式for(int j=0;j<num1.size();j++){//模拟竖式res=A[j]*B[i]+res*10;//cout<<res<<endl;}sum=sum*10+res;res=0;}

方法一:利用数组存出结果,然后再处理进位,如图:这里牵扯到一个知识点就是n位*m位最终返回为m+n-1位

 // 模拟两数相乘的过程for (int i = len2 - 1; i >= 0; i--) {for (int j = len1 - 1; j >= 0; j--) {res[i + j + 1] += A[j] * B[i];}}// 处理进位for (int i = len1 + len2 - 1; i > 0; i--) {if (res[i] >= 10) {res[i - 1] += res[i] / 10;res[i] = res[i] % 10;}}

整体代码:

class Solution {
public:string multiply(string num1, string num2) {if (num1 == "0" || num2 == "0") return "0";vector<int> A, B;int len1 = num1.size(), len2 = num2.size();vector<int> res (len1+len2,0); // 存放相乘结果string ans = "";// 将 num1、num2 分别存入 A、B 中for (int i = 0; i < len1; i++) {A.push_back(num1[i] - '0');}for (int i = 0; i < len2; i++) {B.push_back(num2[i] - '0');}// 模拟两数相乘的过程for (int i = len2 - 1; i >= 0; i--) {for (int j = len1 - 1; j >= 0; j--) {res[i + j + 1] += A[j] * B[i];}}// 处理进位for (int i = len1 + len2 - 1; i > 0; i--) {if (res[i] >= 10) {res[i - 1] += res[i] / 10;res[i] = res[i] % 10;}}// 构造结果字符串for (int i = 0; i < len1 + len2; i++) {if (i == 0 && res[i] == 0) {continue; // 最高位不含前导零}ans += to_string(res[i]); // 将数字转化为字符串}return ans;}
};

  14. 最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""

这道题啊,首先第一个想法就是:横向比较:如图: 

其实就是一个一个比较不断缩小最长公共前缀,公共前缀使用Commen函数截取。(这个函数太赞了)

class Solution {
public:string longestCommonPrefix(vector<string>& strs) {if(strs.size()==0) return " ";string con_str=strs[0];int i=1;while(i<strs.size()){string str=strs[i];con_str=Common(con_str,str);if(!con_str.size()) break;i++;}return con_str;}string Common(string str1, string str2){int len=min(str1.size(),str2.size());int index=0;while (index < len && str1[index] == str2[index]) {++index;}return str1.substr(0,index);}
};

另外提交后还看到一种写法也很赞:将字符串进行排序,第一个和最后一个一定是最不相同的,所以直接找第一个和最后一个的公共前缀即可。

class Solution {
public:string longestCommonPrefix(vector<string>& str) {sort(str.begin(),str.end());string &s1=str.front();string &s2=str.back();int i=0;while(s1[i]==s2[i] && i<s1.size() && i<s2.size()){++i;}return s1.substr(0, i);}
};

 知识点补充:

1.字符串比较:

字符串之间的大小取决于它们接顺序排列字符的前后顺序。
eg。str1="abc”和 str2="acc”,它们的第一个字母都是a,而第二个字母,由于字母b比字母c要靠前,所以b<c,于是我们可以说“abc"<"acd”,也可以说strl < str2.如果说两个字符串 strl和 str2 相等,则必须满足两个条件:
1.字符串 str1 和字符串 str2 的长度相等。
2.字符串 str1 和字符串 str2 对应位置上的各个字符都相同。而对于两个不相等的字符串,我们可以以下面的规则定义两个字符串的大小:
从两个字符串的第0个位置开始,依次比较对应位置上的字符编码大小。
如果 str1|i]对应的字符编码==str2|i]对应的字符编码,则比较下一位字符。
如果 str1|i] 对应的字符编码< str2[i]对应的字符编码,则说明str1<str2。比如:"abc”<"acc”。
如果 str1[i] 对应的字符编码> str2|i]对应的字符编码,则说明str1>str2。比如:"bcd">"bad"如果比较到某一个字符串末尾,另一个字符串仍有剩余:字符串 str1 的长度小于字符串 str2,即len(str1)<len(str2)。则 str1<str2。

所以前面在sort str后,str应该是

["flower","flow","flight"]---->flight flow flower

2.

string a="abcd"1.获取字符串最后一个字符
auto b=a.back(); //结果为 b='d';2.修改字符串最后一个字符
a.back()='!'; //结果为 a="abc!";3.获取字符串第一个字符
auto b=a.front(); //结果为 b='a';4.修改字符串第一个字符
a.front()='!'; //结果为 a="!bcd";

方法三:还有一种方法就是:纵向扫描,

纵向扫描时,从前往后遍历所有字符串的每一列,比较相同列上的字符是否相同,如果相同则继续对下一列进行比较,如果不相同则当前列不再属于公共前缀,当前列之前的部分为最长公共前缀。

class Solution {
public:string longestCommonPrefix(vector<string>& strs) {if (!strs.size()) {return "";}int length = strs[0].size();//行int count = strs.size();//列数for (int i = 0; i < length; ++i) {char c = strs[0][i];for (int j = 1; j < count; ++j) {if (i == strs[j].size() || strs[j][i] != c) {//到头或者有不同return strs[0].substr(0, i);}}}return strs[0];}
};

终于结束了 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/739403.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

swagger踩坑之请求类不显示具体字段

swagger踩坑之请求类不显示具体字段 省流&#xff1a;枚举字段需要加上ApiModelProperty注解 过程复现&#xff1a; TestEnum 枚举不加注解&#xff0c;swagger的UI类不显示详细字段 Data Accessors(chain true) ApiModel(value "test对象", description &quo…

通过Office Web Viewer站点在线展示Office文档内容

方法&#xff1a; https://view.officeapps.live.com/op/view.aspx?src经Url编码的文档线上Url地址 比如&#xff1a; //以下地址来自一份旧项目代码&#xff0c;可见用的就是该方案function OfficeFileViewOnline(url, file_type, file_name) {url "http://14.23.112.2…

算法——哈希王

242.有效的字母异位词 力扣题目链接(opens new window) 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s "anagram", t "nagaram" 输出: true 示例 2: 输入: s "rat", t "car&qu…

配置vscode环境极简版(C/C++)(图文)

前言 众所周知&#xff0c;vscode是一个代码编辑器&#xff0c;不能直接编译运行我们敲的代码&#xff0c;必须提前配置好环境&#xff0c;而这也是劝退一众小白的一大重要因素&#xff0c;下面我想以一种提纲挈领的方式带大家走一遍从配置环境到运行实操代码的全过程。 安装…

Java项目:基于Springboot+vue实现的付费自习室系统设计与实现(源码+数据库+毕业论文)附含微信小程序端代码

一、项目简介 本项目是一套基于Springbootvue实现的付费自习室系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、…

如何利用生成式人工智能完善会议纪要:捕捉会议要点的指南

在当今快节奏的商业环境中&#xff0c;有效的沟通和记录保存至关重要。有组织的会议纪要是这一过程的基石&#xff0c;它们作为会议讨论和决策的书面记录。但如何编写不仅有组织而且可以为出席者和未出席者提供可靠资源的会议纪要呢&#xff1f;让我们深入探讨一下会议纪要的艺…

算法-贪心-XMUOJ圣遗物的强化

题目 思路 贪心 - OI Wiki (oi-wiki.org) 贪心算法&#xff08;greedy algorithm&#xff0c;又称贪婪算法&#xff09;详解&#xff08;附例题&#xff09;-CSDN博客 代码 Python暴力排序 def min_mora_cost(n, levels):levels.sort() # 对圣遗物等级进行升序排序total_…

python数据类型 -- 元组Tuple

你好, 我是木木, 目前正在做两件事   1. 沉淀自己的专业知识   2. 探索了解各种副业项目&#xff0c;同时将探索过程进行分享&#xff0c;帮助自己以及更多朋友找到副业, 做好副业 文末有惊喜 在Python中&#xff0c;元组&#xff08;tuple&#xff09;是一种不可变序列类型&…

PostgreSQL 高可用安装部署

文章目录 一、概述1.PostgreSQL高可用2.Patroni 二、PostgreSQL高可用部署1.安装简介2.安装准备3.安装ETCD4.安装PostgreSQL5.安装Patroni6.安装haproxy7.安装keepalived8.测试 开源中间件 # PostgreSQLhttps://iothub.org.cn/docs/middleware/ https://iothub.org.cn/docs/mi…

Python基础快速入门

Python基础快速入门 前置知识 Python Python是一种广泛使用的高级编程语言&#xff0c;以其易于学习和使用的语法而闻名。以下是Python的一些主要特点&#xff1a; 高级语言&#xff1a;Python是一种高级语言&#xff0c;这意味着它提供了较高层次的抽象&#xff0c;使编程更…

排序算法的对比

类别排序方法时间复杂度空间复杂度稳定性平均情况最好的情况最坏的情况 插入 排序 插入排序稳定希尔排序不稳定 选择 排序 选择排序不稳定堆排序不稳定 交换 排序 冒泡排序稳定快速排序不稳定归并排序稳定基数排序稳定

记录一个编译的LLVM 含clang 和 PTX 来支持 HIPIFY 的构建配置

llvm 18 debug 版本 build llvmorg-18.1rc4 debug $ cd llvm-project $ git checkout llvmorg-18.1.0-rc4 $ mkdir build_d $ cd build_d $ mkdir -p ../../local_d cmake \ -DCMAKE_INSTALL_PREFIX../../local_d \ -DLLVM_SOURCE_DIR../llvm \ -DLLVM_ENABLE_PROJECTS&…

平台工程:构建企业数字化转型的基石

有人说&#xff0c;平台工程&#xff08;Platform Engineering&#xff09;&#xff0c;不过是新瓶装旧酒&#xff08;DevOps&#xff09;。 而Gartner 将平台工程列为 2024 顶级战略技术趋势之一。我国信通院也开始陆续制定与平台工程相关的技术标准。 随着数字化浪潮的席卷…

【数学】【网格】【状态压缩】782 变为棋盘

作者推荐 视频算法专题 本文涉及知识点 数学 网格 状态压缩 LeetCode:782 变为棋盘 一个 n x n 的二维网络 board 仅由 0 和 1 组成 。每次移动&#xff0c;你能任意交换两列或是两行的位置。 返回 将这个矩阵变为 “棋盘” 所需的最小移动次数 。如果不存在可行的变换&am…

day08_Mybatis

文章目录 前言一、快速入门1.1 入门程序分析1.2 入门程序实现1.2.1 准备工作1.2.1.1 创建springboot工程1.2.1.2 数据准备 1.2.2 配置Mybatis1.2.3 编写SQL语句1.2.4 单元测试1.3 解决SQL警告与提示 二、JDBC介绍2.1 介绍2.2 代码2.3 问题分析2.4 技术对比 三、数据库连接池3.1…

c语言经典测试题12

1.题1 float f[10]; // 假设这里有对f进行初始化的代码 for(int i 0; i < 10;) { if(f[i] 0) break; } 上述代码有那些缺陷&#xff08;&#xff09; A: for(int i 0; i < 10;)这一行写错了 B: f是float型数据直接做相等判断有风险 C: f[i]应该是f[i] D: 没有缺…

【YOLOv8模型网络结构图理解】

YOLOv8模型网络结构图理解 1 YOLOv8的yaml配置文件2 YOLOv8网络结构2.1 Conv2.2 C3与C2f2.3 SPPF2.4 Upsample2.5 Detect层 1 YOLOv8的yaml配置文件 YOLOv8的配置文件定义了模型的关键参数和结构&#xff0c;包括类别数、模型尺寸、骨干&#xff08;backbone&#xff09;和头部…

谷歌seo外链重要还是内容重要?

想做网站&#xff0c;内容跟外链缺一不可&#xff0c;如果真的要说哪个更重要&#xff0c;那内容依旧是网站的核心&#xff0c;而外链则是额外的加分项 内容永远是王道&#xff0c;不管谷歌seo的算法怎么变&#xff0c;只要你的内容没问题&#xff0c;那就肯定不会牵扯到你的网…

Oracle 配置多个缓冲池(Keep pool Recycle Pool)

默认情况下&#xff0c;Oracle只有一个缓冲池 - Buffer Cache&#xff0c;其可以满足基本数据缓存需求。但某些数据的访问模式可能与普通数据不同&#xff0c;对于访问非常频繁的数据和很少访问的数据&#xff08;两种极端&#xff09;&#xff0c;Oracle可以支持配置两个独立的…

“312血洗四周年”!比特币冲破7.2万创新高!手持华尔街资金与减半叙事,跃升为全球第8大资产!

在过去一周时间里&#xff0c;比特币三次突破了2021年11月的历史高点。周一&#xff0c;加密市场延续涨势&#xff0c;比特币涨至72000美元以上&#xff0c;盘中一度触及72800美元&#xff0c;以太坊攀升至4000美元以上。 随着比特币再次创下新纪录&#xff0c;其市值已突破1.4…