力扣刷题日志-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];
    }
};

终于结束了 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JMeter 简介及安装详细教程(全网独家)

JMeter 简介 全名为 Apache JMeter JMeter 是一个软件&#xff0c;使负载测试或业绩为导向的业务&#xff08;功能&#xff09;测试不同的协议或技术。 它是 Apache 软件基金会的Stefano Mazzocchi JMeter 最初开发的。 它主要对 Apache JServ&#xff08;现在称为如 Apache T…

Git版本工具学习

目录 版本控制git配置工作区域文件状态git对象模型基础命令.gitignore忽略文件IDEA集成Git 版本控制 本地版本控制&#xff1a;在本地记录每一次版本更新。 集中版本控制&#xff1a;版本数据都保存在单一服务器&#xff0c;不联网就看不到版本信息。SVN 分布式版本控制&…

flink的分组聚合、over聚合、窗口聚合对比

【背景】 flink有几种聚合&#xff0c;使用上是有一些不同&#xff0c;需要加以区分&#xff1a; 分组聚合&#xff1a;group agg over聚合&#xff1a;over agg 窗口聚合&#xff1a;window agg 省流版&#xff1a; 触发计算时机 结果流类型 状态大小 分组聚合group ag…

MongoDB的count() 统计文档数量非常慢

在MongoDB中&#xff0c;count()函数用于统计文档的数量。但是count()函数通常不会使用索引来计算文档数量&#xff0c;而是扫描集合中的文档来计数。当数据量较大的时候&#xff0c;就不适合使用了。 解决方案&#xff1a; 1、使用聚合框架&#xff08;aggregation framewor…

EasyNVR级联EasyCVR,在EasyCVR播放视频会导致EasyNVR崩溃的原因排查与解决

视频综合管理平台EasyCVR视频监控系统支持多协议接入、兼容多类型设备&#xff0c;平台可以将监控区域内所有部署的监控设备进行统一接入与集中汇聚管理&#xff0c;实现对监控区域的实时视频监控、录像与存储、设备管理、云台控制、语音对讲、级联共享等&#xff0c;在监控中心…

从零搭建NodeJS项目(小白教程)

这边文章将介绍如何从零开始创建一个基于Express框架的Node.js项目。Express是一个快速、无拘束且极简的Node.js web应用框架&#xff0c;它提供了一系列强大的功能&#xff0c;使得web开发变得更加高效。 目录 1. 环境准备 2. 安装Express脚手架 3. 创建项目 4. 初始化项…

Clearview X for mac v3.5.0 电子书阅读器 兼容 M1/M2/M3

应用介绍 Clearview X 是 macOS 上的一款简洁易用且美观大方的电子书阅读器。直观好用的图书管理功能&#xff0c;支持 PDF, Epub, MOBI, CHM, FB2, CBR, CBZ 等流行的电子书格式&#xff0c;可以方便地添加注解&#xff0c;插入书签&#xff0c;及迅速的搜索查找。支持在不同…

git init 执行后发生了什么?

首先在磁盘中创建一个新目录 Git&#xff0c;进入该目录后执行 git init 初始化。这个时候目录下会创建一个隐藏目录 ./git&#xff0c;这个./git 目录叫做 Git 版本库或者仓库 $ git init Initialized empty Git repository in D:/Git/.git/ 在讲解.git 目录内容前&#xff0…

【C++】关联式容器

目录 前言&#xff1a; 一&#xff0c;set容器 二&#xff0c;multiset容器 三&#xff0c;map容器 四&#xff0c;multimap容器 前言&#xff1a; 在C中&#xff0c;STL中的部分容器&#xff0c;比如&#xff1a;vector、list、deque、 forward_list(C11)等&#xff0c;这…

第五届国际信息技术与教育技术大会(ITET 2024)即将召开!

2024年第五届国际信息技术与教育技术大会&#xff08;ITET 2024&#xff09;将于5月10-12日在日本鸟取举行。本届会议由日本鸟取大学主办&#xff0c;冈山大学、湘南工业大学、名古屋工业大学、山口大学等提供技术支持。ITET 2024旨在探讨计算机领域的创新发展在教育环境中所带…

javase day03笔记

第三天课堂笔记 idea的使用★★★ 创建空工程创建模块创建包&#xff1a;package创建类idea的设置 file -> settings 快捷键 shift &#xff0b; 回车 &#xff1a; 光标切换到下一行psvm回车&#xff1a; main方法main回车&#xff1a;main方法sout回车&#xff1a;输…

快速入门:JS对象/BOM/DOM/事件监听

本贴介绍JS相对进阶的知识&#xff0c;对于JavaScript的基础语法&#xff0c;本文不再赘述~ 一.JavaScript对象 1.Array数组对象 定义 var arr new Array(1,2,3); var arr[1,2,3]; 访问 arr[0]1; Js数组类似Java中的集合&#xff0c;长度&#xff0c;类型都可以改变。 如…

Web端功能测试方法最有作用的5个点

对于web测试&#xff0c;较之其他软件测试又有所不同&#xff0c;这是细节的不同&#xff0c;这个不同需要我们在不停的测试中去总结的。 web测试正式测试之前&#xff0c;应先确定如何开展测试&#xff0c;不可盲目的测试&#xff0c;讲究方法才能行之有效的提高我们的效…

Linux——文件缓冲区与模拟实现stdio.h

前言 我们学习了系统层面上的文件操作&#xff0c;也明白了重定向的基本原理&#xff0c;在重定向中&#xff0c;我们使用fflush(stdout)刷新了缓冲区&#xff0c;当时我们仅仅知道重定向需要刷新缓冲区&#xff0c;但是不知道其所以然&#xff0c;今天我们来见识一下。 一、…

框架学了不会用?四小时做完一个完整的前后端分离demo(SpringBoot+Vue)

四小时做完一个完整的前后端分离demo&#xff08;SpringBootVue&#xff09; 分享一个看到的还不错的小项目&#xff0c;非常适合刚学完框架但是没有太多动手机会的的学生党用来练手。 优势 手把手写代码&#xff0c;有教学视频免费&#xff0c;有源代码项目周期短 视频教程…

Nvidia显卡@参数规格@驱动下载@cuda版本查看

文章目录 Nvidia显卡产品类型GeForce系列 命名规则前缀和后缀技术特点性能指标/&#x1f47a;显存(VRAM)显存和位宽位宽和现存容量的设计 其他 显卡信息查看Nvidia官网查看其他数据库核心规格GeForce系列产品参数在线查看&#x1f47a;大汇显卡规格总比较其他显卡规格比较 性能…

Facebook、亚马逊账号如何养号?

之前我们讨论过很多关于代理器的问题。它们的工作原理是什么?在不同的软件中要使用那些代理服务器?这些代理服务器之间的区别是什么?什么是反检测浏览器等等。 除了这些问题&#xff0c;相信很多人也会关心在使用不同平台的时代理器的选择问题。比如&#xff0c;为什么最好…

目标检测——布匹缺陷检测数据集

一、简要 布匹瑕疵是指在布料生产过程中或后续处理中出现的各种不符合质量标准或期望的缺陷。这些瑕疵可能源自原料、织造工艺、染色、印花、加工等多个环节。布匹瑕疵的类型繁多&#xff0c;涵盖了结构瑕疵和质量瑕疵两大类。结构瑕疵指的是布料本身的缺陷&#xff0c;包括嵌…

Skia最新版CMake编译

运行示例&#xff1a;example/HelloWorld.cpp Skia: 2024年03月08日 master分支: 993a88a663c817fce23d47394b574e19d9991f2f 使用CMake编译 python tools/git-sync-depsbin/gn gen out/config --idejson --json-ide-script../../gn/gn_to_cmake.py此时output目录会生成CM…

指数幂+力扣

题目 题目链接 . - 力扣&#xff08;LeetCode&#xff09; 题目描述 代码实现 class Solution { public:double myPow(double x, int n) {long t n;return t > 0 ? _myPow(x, t) : 1 / _myPow(x, -t);}double _myPow(double x, int n){if(n 0) return 1;double y _…