代码随想录刷题随记7-字符串1

news2024/11/15 11:29:41

代码随想录刷题随记7-字符串1

文章目录

  • 代码随想录刷题随记7-字符串1
    • 344.反转字符串
    • 541. 反转字符串II
    • 替换数字
    • 151.翻转字符串里的单词
    • 右旋字符串

344.反转字符串

leetcode链接
主要的难点在于使用 O(1) 的额外空间解决这一问题
反转字符串依然是使用双指针的方法
swap可以有两种实现。

一种就是常见的交换数值:
一种就是通过位运算,这个之前没见过,这里记录一下

s[i] ^= s[j];
s[j] ^= s[i];
s[i] ^= s[j];

解题代码

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

541. 反转字符串II

leetcode链接
整体反转的思路和上一道题目一样
在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。
解题代码:

class Solution {
public:
    void swap(string &s,int i,int j){
        if(i==j){
            return;
        }
           char tmp=s[i];
           s[i]=s[j];
           s[j]=tmp;
    }
    void reverse(string & s,int i,int j){
         while(i<j){
           swap(s,i,j);
           i++;
           j--;
         }
    }
    string reverseStr(string s, int k) {
       for(int i=0;i<s.size();i+=(2*k)){
        //剩余的字符大于等于k小于等于2k
        if(i+k<=s.size()){
          reverse(s,i,i+k-1);
          continue;
        }
        //剩余小于k
        reverse(s,i,s.size()-1);
       }
       return s;
    }
};

替换数字

题目链接
可以用双指针法实现空间复杂度为O(1)的,但这种方法java里面不适用。
在这里插入图片描述
为啥要从后往前遍历:因为前面一截是没转化为number的字符串,如果从前往后遍历就会被覆盖。
解题源码:

#include<string>
#include<iostream>
using namespace std;
int main(){
    string s;
    char chars[6]={'r','e','b','m','u','n'};
    while(cin>>s){
        int count=0;
        for(int i=0;i<s.size();i++){
            if(s[i]>='0'&&s[i]<='9'){
                count++;
            }
        }
        int i=s.size()-1;
        s.resize(s.size()+count*5);
        int j=s.size()-1;
        while(i>=0){
            if(s[i]>='0'&&s[i]<='9'){
                // for(int k=0;k<6;k++){
                //     s[j]=chars[k];
                //     j--;
                // }
                s[j-5] = 'n';
                s[j-4] = 'u';
                s[j-3] = 'm';
                s[j-2] = 'b';
                s[j-1] = 'e';
                s[j]   = 'r';
                j -= 5;
            }
            else{
                s[j]=s[i];
            }
            i--;
            j--;
            
        }
        cout << s << endl;
    }
}

151.翻转字符串里的单词

leetcode链接
用栈实现
解题代码:

class Solution {
public:
    string reverseWords(string s) {
   vector<string> stack;
   int top=-1;
   int  pre=0;
   int flag=0;
   for(int i=0;i<s.size();i++)
   {
      if(s[i]==' '){
        if(flag!=0){
            stack.push_back(s.substr(pre,i-pre));      
            top++;
        }
         
        while(s[i]==' ') i++;
        pre=i;
      }
      if(s[i]!=' ')
      flag=1;
   }
   if(s[s.size()-1]!=' '){
    stack.push_back(s.substr(pre,s.size()-pre));
    top++;
   }
   string ret="";
   for(;top>=0;top--){
     ret+=stack[top];
     if(top!=0)
        ret+=" ";
   }
   return ret;
    }
};

右旋字符串

题目链接
先把子串反转一遍,再整个反转一遍。负负得正就起到了整体的效果。
解题代码

#include<iostream>
using namespace std;
void reverse(string & s,int i,int j){
    if(i== j)
       return;
    while(i<j){
       char tmp=s[i];
       s[i]=s[j];
       s[j]=tmp;
       i++;
       j--;
    }
}
int main(){
    int k;
    string s;
    cin>>k;
    cin>>s;
    reverse(s,0,s.size()-k-1);
    reverse(s,s.size()-k,s.size()-1);
    reverse(s,0,s.size()-1);
    cout<<s<<endl;;
    
}

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

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

相关文章

【算法刷题day4】Leetcode:24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II

24. 两两交换链表中的节点 文档链接&#xff1a;[代码随想录] 题目链接&#xff1a;24. 两两交换链表中的节点 状态&#xff1a;ok 题目&#xff1a; 给定一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后的链表。 你不能只是单纯的改变节点内部的值&#…

老壁灯带你入门动态规划

1. 什么是动态规划 动态规划(dynamic programming)是运筹学的一个分支&#xff0c;是求解决策过程(decision process)最优化的数学方法。 从字面意义上来理解&#xff0c;就是走一步看一步&#xff0c;边解决问题&#xff0c;边对问题进行整体规划。 其实&#xff0c;动态规…

STM32学习笔记(7_2)- ADC模数转换器代码

无人问津也好&#xff0c;技不如人也罢&#xff0c;都应静下心来&#xff0c;去做该做的事。 最近在学STM32&#xff0c;所以也开贴记录一下主要内容&#xff0c;省的过目即忘。视频教程为江科大&#xff08;改名江协科技&#xff09;&#xff0c;网站jiangxiekeji.com 本期开…

MyBatis入门01

MyBatis入门01 文章目录 MyBatis入门01前言一、搭建环境1.新建一个普通的maven项目2.删除src目录3.导入maven依赖&#xff1a;mysql驱动&#xff08;操作jdbc&#xff09;&#xff0c;juint&#xff0c;mybatis注意&#xff1a;要假如builder标签&#xff0c;预防配置文件不可导…

3.27作业

1、完成下面类 #include <iostream> #include <cstring> using namespace std;class myString { private:char *str; //记录c风格的字符串int size; //记录字符串的实际长度 public://无参构造myString():size(10){str new char[size]; …

算法(6)KMP+trie

KMP&#xff1a; 最浅显易懂的 KMP 算法讲解_哔哩哔哩_bilibili 该视频使用python书写代码&#xff0c;不会python的小伙伴也可以看看了解kmp的大致思路。 问题描述&#xff1a; kmp&#xff1a;字符串匹配算法&#xff0c;用来找一个长字符串中出现了几次小字符串&#xf…

SpringBoot整合Redis:缓存击穿--互斥锁解决

&#x1f389;&#x1f389;欢迎光临&#xff0c;终于等到你啦&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;持续更新的专栏Redis实战与进阶 本专栏讲解Redis从原理到实践 …

【旅游】泉州攻略v1.0.0

一、泉州古城 泉州市距离深圳大约520公里&#xff0c;从深圳北站出发&#xff0c;高铁大约3小时30分。 到达泉州西站后&#xff0c;往东南方向大约8公里&#xff0c;就可以到达主要的旅游景点泉州古城。 古城很适合使用一天玩耍&#xff0c;核心路线如下&#xff1a; 一路的景…

#Linux系统编程(关于解决Source Insight自动补全的问题)

&#xff08;一&#xff09;发行版&#xff1a;Ubuntu16.04.7 &#xff08;二&#xff09;记录&#xff1a; &#xff08;1&#xff09;参考博文 Source Insight 4.0 添加函数库的头文件实现函数的自动补齐 - 简书 (jianshu.com)https://www.jianshu.com/p/96595eefb988 &am…

关于内存函数的介绍

1.memcpy 2.memmove 3.memset 4.memcmp 其中&#xff0c;重点讲解memcpy 以及memmove。 1.C 库函数&#xff1a; void *memcpy(void *str1, const void *str2, size_t n) 函数作用&#xff1a;在 str2 复制 n 个字节到 str1。 其中&#xff0c;str1用于指向存储复制内容…

前端学习<二>CSS基础——04-CSS选择器:伪类

伪类&#xff08;伪类选择器&#xff09; 伪类&#xff1a;同一个标签&#xff0c;根据其不同的种状态&#xff0c;有不同的样式。这就叫做“伪类”。伪类用冒号来表示。 比如div是属于box类&#xff0c;这一点很明确&#xff0c;就是属于box类。但是a属于什么类&#xff1f;…

onnxruntime 中的 Gather 算子

上一篇文章中介绍了 Division by Invariant Integers using Multiplication 的原理&#xff0c;很多框架均才用该算法优化除法运算。onnxruntime 是已知实现中最为简洁的&#xff0c;因此本文结合 onnxruntime 的 Gather 实现进行介绍。 Gather 算子是一个索引类算子&#xff0…

unity学习(72)——编译游戏发生错误4——GAME_STATE状态

1.经过一天的冷静&#xff0c;我感觉问题出在mapHandler的update中。 如果还没有初始化对象&#xff0c;就开始读取对象的内容&#xff0c;一定会有异常的。 2.之前已有GameState结构体&#xff0c;我一直没当回事&#xff0c;这次用到了 3.从user切换到map场景的过程中会触发如…

号码采集协议讲解

仅供学习研究交流使用 需要的进去拿源码或者成品

【区块链】C语言编程实现三叉Merkle树

目录 1. Merkle树简介2. 构建Merkle树3. 生成SPV路径4. 验证SPV路径5. 三叉Merkle树创建、SPV生成及验证总程序6. 程序运行结果 1. Merkle树简介 如上图所示&#xff0c;Merkle 树的叶子节点为交易序列&#xff0c;对每一笔交易进行 Hash&#xff08;SHA 256算法&#xff09; 之…

vivado 在远程主机上启动作业、ISE命令图、实施类别,战略描述和指令映射

在远程主机上启动作业 一旦配置了远程主机&#xff0c;使用它们启动Vivado作业就很容易了。下图显示了启动运行对话框。启动跑步时&#xff0c;选择“在远程上启动跑步”hosts或Launch在群集上运行&#xff0c;然后选择特定的群集。这些作业将使用您的要执行的预配置设置。 作业…

针对COT控制模式下低ESR电容造成次谐波振荡问题的片内斜波补偿方案

COT模式&#xff1a;MOS管固定导通时间控制模式&#xff0c;关断时间由输出反馈电压与内部基准源的相较值决定。 RBCOT控制模式&#xff1a;Ripple-Based COT基于纹波的固定导通时间控制方法&#xff0c;特别的是环路控制部分主要有固定导通时间发生装置及比较器组成。RBCOT控…

DreamPolisher、InternLM2 、AniArtAvatar、PlainMamba、AniPortrait

本文首发于公众号&#xff1a;机器感知 DreamPolisher、InternLM2 、AniArtAvatar、PlainMamba、AniPortrait DreamPolisher: Towards High-Quality Text-to-3D Generation via Geometric Diffusion We present DreamPolisher, a novel Gaussian Splatting based method wit…

PPP实验

一、实验拓扑图 二、实验要求 1、R1和R2使用PPP链路直连&#xff0c;R2和R3把2条PPP链路捆绑为PPP MP直连 2、按照图示配置IP地址 3、R2对R1的PPP进行单向chap验证 4、R2和R3的PPP进行双向chap验证 三、实验步骤 1、PPP MP&#xff1a; &#xff08;1&#xff09;R2配置&#x…

C语言从入门到实战----数据在内存中的存储

1. 整数在内存中的存储 在讲解操作符的时候&#xff0c;我们就讲过了下⾯的内容&#xff1a; 整数的2进制表⽰⽅法有三种&#xff0c;即 原码、反码和补码 有符号的整数&#xff0c;三种表⽰⽅法均有符号位和数值位两部分&#xff0c;符号位都是⽤0表⽰“正”&#xff0c;⽤…