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

news2024/11/15 19:28:47

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.coloradmin.cn/o/1510663.html

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

相关文章

Sui与数据平台ZettaBlock达成合作,为其公测提供数据

Sui一向以闪电般的速度、无限水平扩展著称&#xff0c;现已迅速成为DeFi活动的重要场所。近期&#xff0c;数据平台ZettaBlock宣布在其开创性的Web3数据平台发布中&#xff0c;选择Sui作为基础集成合作伙伴之一。在ZettaBlock的开放测试版发布之际&#xff0c;构建者和开发者将…

【JAVA】HashMap扩容性能影响及优化策略

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 结语 我的其他博客 前言 在软件开发中&#xff0c;HashMap是一种常用的数据结构&#xff0c;但在处理大量数据时&#xff0c;其扩容…

11、设计模式之享元模式(Flyweight)

一、什么是享元模式 享元模式是一种结构型的设计模式。它的主要目的是通过共享对象来减少系统种对象的数量&#xff0c;其本质就是缓存共享对象&#xff0c;降低内存消耗。 享元模式将需要重复使用的对象分为两个部分&#xff1a;内部状态和外部状态。 内部状态是不会变化的&…

进电子厂了,感触颇多...

作者&#xff1a;三哥 个人网站&#xff1a;https://j3code.cn 本文已收录到语雀&#xff1a;https://www.yuque.com/j3code/me-public-note/lpgzm6y2nv9iw8ec 是的&#xff0c;真进电子厂了&#xff0c;但主人公不是我。 虽然我不是主人公&#xff0c;但是我经历的过程是和主…

【2024-03-12】设计模式之模板模式的理解

实际应用场景&#xff1a;制作月饼 过程描述&#xff1a; 一开始&#xff0c;由人工制作月饼&#xff0c; 第一个&#xff1a;根据脑子里面月饼的形状&#xff0c;先涅出月饼的形状&#xff0c;然后放入面粉和馅料把开口合并起来。 第二个&#xff1a;根据脑子里面月饼的形状&…

短剧小程序系统:打造沉浸式短剧体验,开启短剧新纪元

随着移动互联网的迅猛发展&#xff0c;短剧作为一种新兴的内容形式&#xff0c;正逐渐受到广大用户的喜爱和追捧。为了满足用户对短剧内容的需求和观看体验的提升&#xff0c;短剧小程序系统应运而生&#xff0c;为用户带来了更加便捷、沉浸式的短剧观看体验。 短剧小程序系统…

如何在Linux本地搭建Tale网站并实现无公网ip远程访问

文章目录 前言1. Tale网站搭建1.1 检查本地环境1.2 部署Tale个人博客系统1.3 启动Tale服务1.4 访问博客地址 2. Linux安装Cpolar内网穿透3. 创建Tale博客公网地址4. 使用公网地址访问Tale 前言 今天给大家带来一款基于 Java 语言的轻量级博客开源项目——Tale&#xff0c;Tale…

【Python】科研代码学习:八 FineTune PretrainedModel (用 trainer,用 script);LLM文本生成

【Python】科研代码学习&#xff1a;八 FineTune PretrainedModel [用 trainer&#xff0c;用 script] LLM文本生成 自己整理的 HF 库的核心关系图用 trainer 来微调一个预训练模型用 script 来做训练任务使用 LLM 做生成任务可能犯的错误&#xff0c;以及解决措施 自己整理的 …

8块硬盘故障的存储异常恢复案例一则

关键词 华为存储、硬盘域、LUN热备冗余、重构、预拷贝 oracle rac、多路径 There are many things that can not be broken&#xff01; 如果觉得本文对你有帮助&#xff0c;欢迎点赞、收藏、评论&#xff01; 一、问题现象 近期遇到的一个案例&#xff0c;现象是一套oracl…

PXI8540高速数据采集卡

XI高速数据采集卡&#xff0c;PXI8540卡是一种基于PXI总线的模块化仪器&#xff0c;可使用PXI系统&#xff0c;在一个机箱内实现一个综合的测试系统&#xff0c;构成实验室、产品质量检测中心等各种领域的数据采集、波形分析和处理系统。也可构成工业生产过程监控系统。它的主要…

ThreeWayBranch 优化阅读笔记

1. 优化目的 通过重排三分支的 BB 块减少比较指令的执行次数 代码路径: bolt/lib/Passes/ThreeWayBranch.cpp2. 效果 优化前&#xff1a; 注&#xff1a; 黄色数字表示BB块编号&#xff0c; 紫色表示该分支跳转的次数&#xff0c;绿色是代码里BB块的变量名 ThreeWayBranc…

P6327 区间加区间 sin 和 (线段树+数学)

传送门https://www.luogu.com.cn/problem/P6327 比较板子的一题&#xff0c;主要考察公式 //sin(ax)sinxcosasinacosx //cos(ax)cosacosx-sinasinx 直接贴代码吧 // Problem: // P6327 区间加区间 sin 和 // // Contest: Luogu // URL: https://www.luogu.com.cn/pr…

@Conditional注解详解

目录 一、Conditional注解作用 二、Conditional源码解析 2.1 Conditional源码 2.2 Condition源码 三、Conditional案例 3.1 Conditional作用在类上案例 3.1.1 配置文件 3.1.2 Condition实现类 3.1.3 Bean内容类 3.1.4 Config类 3.1.5 Controller类 3.1.6 测试结果 3…

ChatGPT GPT4科研应用、数据分析与机器学习、论文高效写作、AI绘图技术

原文链接&#xff1a;ChatGPT GPT4科研应用、数据分析与机器学习、论文高效写作、AI绘图技术https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247596849&idx3&sn111d68286f9752008bca95a5ec575bb3&chksmfa823ad6cdf5b3c0c446eceb5cf29cccc3161d746bdd9f2…

Lim接口测试平台开展自动化的优势

一、数据对比 使用Lim接口测试平台后&#xff0c;相比以往采用Postman或excel关键字驱动带来的效率提升&#xff1a; 编写效率提升300%&#xff0c;原来10个步骤的用例&#xff0c;一个工作日调试编写只能输出6条&#xff0c;现在一天能输出18条。维护成本复杂度降低100%&…

Vue3.0里为什么要用 Proxy API 替代 defineProperty API

一、Object.defineProperty 定义&#xff1a;Object.defineProperty() 方法会直接在一个对象上定义一个新属性&#xff0c;或者修改一个对象的现有属性&#xff0c;并返回此对象 为什么能实现响应式 通过defineProperty 两个属性&#xff0c;get及set get 属性的 getter 函…

北斗卫星助力海上风电厂:打造海上绿色能源新时代

北斗卫星助力海上风电厂&#xff1a;打造海上绿色能源新时代 近日&#xff0c;东海航海保障中心温州航标处在华能苍南海上风电场完成首套北斗水上智能感知综合预警系统现场安装调试工作&#xff0c;经现场效能测定&#xff0c;能有效保障海上风电场运行安全和海域船舶通航安全…

华为OD机试 - 模拟数据序列化传输(Java JS Python C C++)

题目描述 模拟一套简化的序列化传输方式,请实现下面的数据编码与解码过程 编码前数据格式为 [位置,类型,值],多个数据的时候用逗号分隔,位置仅支持数字,不考虑重复等场景;类型仅支持:Integer / String / Compose(Compose的数据类型表示该存储的数据也需要编码)编码后数…

光电容积脉搏波PPG信号分析笔记

1.脉搏波信号的PRV分析 各类分析参数记参数 意义 公式 参数意义 线性分析 时域分析 均值MEAN 反应RR间期的平均水平 总体标准差SDNN 评估24小时长程HRV的总体变化&#xff0c; SDNN &#xff1c; 50ms 为异常&#xff0c;SDNN&#xff1e;100ms 为正常&#xff1b;…