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

代码随想录第55期训练营第八天|LeetCode344.反转字符串、541.反转字符串II、卡码网:54.替换数字

前言

这是我参加的第二次训练营!!!爽!这次我将更加细致的写清每一道难题,不仅是提升自己,也希望我自己的写的文章对读者有一定的帮助!

打卡代码随想录算法训练营第55期第八天(づ ̄3 ̄)づ╭❤~ 

首先十分推荐学算法的同学可以先了解一下代码随想录,可以在B站卡哥B站账号、代码随想录官方网站代码随想录了解,卡哥清晰易懂的算法教学让我直接果断关注,也十分有缘和第55期的训练营大家庭一起进步。


今日题目

LeetCode 344 反转字符串

题目链接:344 反转字符串

文章讲解:反转字符串

视频讲解:卡哥讲解 —— 反转字符串

这道题没有什么好说的,如果这都没有想到左右指针的话,应该是新手,多练,多刷,自然会有感觉。

public class Solution {
    public void ReverseString(char[] s) {
        //左右指针 中间值交换即可
        for(int i = 0,right = s.Length - 1; i < s.Length / 2; i++,right--)
        {
            char temp  = s[i];
            s[i] = s[right];
            s[right] = temp;
        }
    }
}

LeetCode 541 反转字符串II

题目链接:541 反转字符串II

文章讲解:反转字符串II

视频讲解:卡哥讲解 —— 反转字符串II

这道题其实有点迷惑人的意思了,其实就是一段字符串,从左往右遍历K个翻转,然后再遍历K个不动,再遍历K个翻转,直到最后剩下不到K个,全部翻转,所以在for循环中,翻转的只是K个,而不是2K个,注意审题。

public class Solution {
    public string ReverseStr(string s, int k) {
        if(s.Length == 1)
            return s;
        char[] array = s.ToArray<char>();
        for(int i = 0; i < s.Length; i += 2 * k/*每次移动2k个字符*/)
        {
            if(i + k <= s.Length)//看是否够翻转k个长度
                Reverse(array , i , i + k - 1);
            else//不够则把剩下的全部反转
                Reverse(array, i , array.Length - 1);
        }
        return new string(array);
    }
    //翻转函数
    public char[] Reverse(char[] array, int left, int right)
    {
        while(left < right)
        {
            char temp = array[left];
            array[left] = array[right];
            array[right] = temp;
            left++;
            right--;
        }
        return array;
    }
}

卡码网 54 替换数字

题目链接:54 替换数字

文章讲解:替换数字

本题确实好理解,但是引用了一个非常牛逼的思路就是后序,因为对于数组来说,如果从头遍历,每次往后扩充就会导致后面的值往后扩充,但是如果是后序的话,就巧妙的避开了这个问题。

#include <iostream>
using namespace std;
int main() {
    string s;
    while (cin >> s) {
        int sOldIndex = s.size() - 1;
        int count = 0; // 统计数字的个数
        for (int i = 0; i < s.size(); i++) {
            if (s[i] >= '0' && s[i] <= '9') {
                count++;
            }
        }
        // 扩充字符串s的大小,也就是将每个数字替换成"number"之后的大小
        s.resize(s.size() + count * 5);
        int sNewIndex = s.size() - 1;
        // 从后往前将数字替换为"number"
        while (sOldIndex >= 0) {
            if (s[sOldIndex] >= '0' && s[sOldIndex] <= '9') {
                s[sNewIndex--] = 'r';
                s[sNewIndex--] = 'e';
                s[sNewIndex--] = 'b';
                s[sNewIndex--] = 'm';
                s[sNewIndex--] = 'u';
                s[sNewIndex--] = 'n';
            } else {
                s[sNewIndex--] = s[sOldIndex];
            }
            sOldIndex--;
        }
        cout << s << endl;       
    }
}


http://www.kler.cn/a/595280.html

相关文章:

  • HTML5拖拽功能教程
  • 【Linux网络-NAT、代理服务、内网穿透】
  • 从沈抖到谢广军,百度智能云何时“云开月明”?
  • poetry安装与使用
  • 什么是跳表?(Skip List)
  • cippe2025北京石油展,遨游通讯将携多款防爆手机亮相!
  • Java高并发容器的内核解析:从无锁算法到分段锁的架构演进
  • 移动WEB开发之rem适配布局
  • 搭建主从DNS、nfs、nginx
  • 36、deque分配器的作用
  • Qt 基本使用方法介绍
  • 从零开始学2PC:分布式事务的原子性保障
  • C++编译流程
  • UNIX网络编程笔记:一些网络协议的相关知识
  • 【Android】基础架构(详细介绍)
  • WordPress 性能优化技术指南:打造快速加载的网站
  • 【python】OpenCV—Hand Landmarks Detection
  • 能源监控软件UI界面设计:平衡功能性与审美性的艺术
  • 针对耳鸣患者推荐的一些菜谱和食材
  • 透析Vue的nextTick原理