算法练习day8

news2024/11/18 7:23:22

反转字符串

代码随想录 0344.反转字符串

344. 反转字符串 - 力扣(LeetCode)

(用时:0.05小时)

思路

这道题很简单也很经典。

字符串的反转方法有很多,我这里是用for循环通过数组长度和下标计算来交换。

写这道题时逻辑不难,后面涉及到指定区域的翻转后,脑子就跟不上了。。。后面就直接用双指针了。。

代码实现

public class ReverseString
{
    public void ReverseStringFun(char[] s)
    {
        char temp;
        for(int i=0;i<s.Length/2;i++)
        {
            temp = s[i];
            s[i] = s[s.Length-1-i];
            s[s.Length - 1 - i] = temp;
        }
    }
}

反转字符串II

代码随想录 0541.反转字符串II

541. 反转字符串 II - 力扣(LeetCode)

(用时:3小时)

思路

这道题主要是要理解题意。。

题目要求我们按2K为一组,每组的前K个元素进行翻转。

  • 这意味着一般的情况应该是K个翻转K个不翻转

  • 当元素无法达到2K时:

    若>K,则翻转K个元素 若<K,则翻转剩余所有的元素

    image-20240514104414238

错误

这道题在交换指定区域的数组元素中卡住,对自己更无语了

上一道题是用for循环,然后直接通过计算一下子秒掉了,但是这道题中,初始值和终点值有变化,写多了看多了逻辑就混乱了。。。。于是用回了while双指针。。。

代码实现

public char[] ReserseChars(int start,int end, char[] chars)
{
    char temp;
    while(start<end)
    {
        temp = chars[start];
        chars[start] = chars[end];
        chars[end] = temp;
        start++;
        end--;
    }
    return chars;
}
​
public string ReverseStr(string s, int k)
{
    char[] ans =  s.ToArray<char>();
    for (int i=0;i<s.Length;i+=2*k)
    {
        //剩余的少于k个
        if (i+k>ans.Length)
        {
            ans = ReserseChars(i, ans.Length-1, ans);
        }
        //大于k个小于2k个
        else
        {
            ans = ReserseChars(i, i + k-1, ans);
        }
    }
    return new string(ans);
}

翻转字符串里的单词

代码随想录 0151.翻转字符串里的单词

151. 反转字符串中的单词 - 力扣(LeetCode)

(用时:2小时)

思路

这道题是对字符串中的单词翻转,意思就是单词的顺序翻转,单词本身里面的字母不要翻转。

要实现有很多种方法,又看到一位大佬用了字典(键值对)。我刚开始也想着可以用分割字符串的方法。

但训练算法时还是不要用这么多库函数。卡哥也要求我们在原字符串上操作。

我们可以先将整体的字符串翻转,这样单词的顺序就达到了我们的效果。但是单词的字母也翻转了,我们逐一对单个单词再翻转一次即可。此外还要消减空格,让每个单词之间只有一个空格。

重点

个人感觉这道题主要是思路上的问题。卡哥给的思路很清晰,所以实现起来没有出什么问题。

但是自己想的时候是很混乱的,判断来判断去的。。。思路真的很重要啊!

错误

写的过程中,犯了一些错误:

  1. 去除空格和翻转单词的实现。

  2. 最终输出的字符串,后面多余了很多重复的字母们。

  3. 使用ReserseChars时数组越界

  4. 分别在去除空格和翻转单词的for循环中,while循环的条件数组越界了。

个人理解如下:

  • 去除空格和翻转单词的实现错误。

    这道题里,去除空格和翻转单词分开做比较好,这样不容易乱。

  • 最终输出的字符串,后面多余了很多重复的字母们。

    后面重复的都是新字符串中无用的空间。因为新的字符串的长度没有记录下来,导致后面翻转单词时依旧遍历原本字符串的长度,把后面多余的“垃圾”也翻转,然后输出了。

  • 使用ReserseChars时数组越界

    这是在输入begin和end的时候,fast此时在前面的while中,可能是=len了,此时ans[fast]会越界。

    而且这个单词有效的范围也是slow到fast-1,fast本身停止的条件就是当fast指向不属于该单词的范围的时候(即越界或者遇到空格的单词结束。)

  • 分别在去除空格和翻转单词的for循环中,while循环的条件数组越界了。

    这是因为在for中间,“擅自”让i/fast向前探索,只有两种情况下会让它停下来: 一是找到指定要求的地方了(比如找到不属于单词的部分了) 二是到了末尾,这个单词刚好是最后一个。

    第一种情况用ans[fast或i]!=' '既可,但第二种情况下的ans是会越界的!因此要有一个判断其是否超出范围的条件,且这个条件要放在第一个条件前判断。

代码实现

这道题是剑指Offer的题目。力扣上已经下架了,卡哥的卡玛网上没有C#的检测,也没有专门去写C++的版本。。。

public char[] ReserseChars(int start, int end, char[] chars)
{
    char temp;
    while (start < end)
    {
        temp = chars[start];
        chars[start] = chars[end];
        chars[end] = temp;
        start++;
        end--;
    }
    return chars;
}
​
​
public string Reserse(string s,int k)
{
    char[] ans = ReserseChars(0, s.Length - 1, s.ToArray<char>());
​
    ans = ReserseChars(0, k-1, ans);
    ans = ReserseChars(k - 1, s.Length - 1, ans);
​
    return new string(ans);
}

替换数字(空格)

代码随想录 0054.替换数字

(用时:1小时)

这道题没有对字符串的翻转操作了,本题主要考察的是插入删除(个人感觉)。

C#中对string的扩张不用库函数太麻烦了,因此就不写卡哥教的双指针的方法了,实现用了库函数。卡哥的方法有分析了一下,接下来二刷试试用C++实现吧。

代码实现

public string Replace(string s)
{
    string number = "number";
    int index = 0;
​
    while(index<s.Length)
    {
        if (s[index]>='0' && s[index]<='9')
        {
            s = s.Remove(index, 1);
            s = s.Insert(index, number);
        }
        index++;
    }
    return s;
}

右旋字符串

代码随想录 0055.右旋字符串

(用时:1小时)

只能说太牛了卡哥的思路!写完上一题过来还是没有想到这个想法:整体翻转+局部翻转

思路和翻转单词那里一样。

同样也是剑指Offer。

代码实现

public char[] ReserseChars(int start, int end, char[] chars)
{
    char temp;
    while (start < end)
    {
        temp = chars[start];
        chars[start] = chars[end];
        chars[end] = temp;
        start++;
        end--;
    }
    return chars;
}
​
​
public string Reserse(string s,int k)
{
    char[] ans = ReserseChars(0, s.Length - 1, s.ToArray<char>());
​
    ans = ReserseChars(0, k-1, ans);
    ans = ReserseChars(k - 1, s.Length - 1, ans);
​
    return new string(ans);
}

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

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

相关文章

Git使用(2):远程仓库

一、创建远程仓库 登录码云Gitee - 基于 Git 的代码托管和研发协作平台。 点击右上角&#xff0c;新建仓库。 创建完成&#xff0c;复制仓库地址接下来要使用。 二、将idea项目推送到码云 首先创建本地仓库VCS -> Create Git Repository。然后选择Manage Remotes&#xff0…

pyqt QComboBox下拉列表框控件

pyqt QComboBox下拉列表框控件 QComboBox效果代码 QComboBox QComboBox 是 PyQt&#xff08;中的一个控件&#xff0c;它允许用户从下拉列表中选择一个选项。这个控件在需要用户从预定义选项中进行选择时非常有用。 效果 代码 import sys from PyQt5.QtWidgets import QAppl…

谈谈 Spring 的过滤器和拦截器

前言 我们在进行 Web 应用开发时&#xff0c;时常需要对请求进行拦截或处理&#xff0c;故 Spring 为我们提供了过滤器和拦截器来应对这种情况。那么两者之间有什么不同呢&#xff1f;本文将详细讲解两者的区别和对应的使用场景。 &#xff08;本文的代码实现首先是基于 Sprin…

暗区突围TWITCH掉宝关联帐号不了 无法关联帐号 关联不上

Twitch&#xff0c;作为全球知名的游戏直播平台&#xff0c;常常携手热门游戏如《暗区突围》举办互动活动&#xff0c;为玩家带来独特的参与体验。在这个过程中&#xff0c;“绑定关联”成为了连接直播观众与游戏世界的桥梁。简单来说&#xff0c;Twitch绑定关联《暗区突围》指…

【架构-17】通信系统架构设计理论

通信系统网络架构 1. 局域网网络架构 拓扑结构&#xff1a;星型、总线型、环型、树型。 网络架构&#xff1a;单核心架构&#xff08;结构简单&#xff0c;地理范围受限&#xff09;、双核心架构&#xff08;网络拓扑结构可靠&#xff0c;投资较单核高&#xff09;、环型架构…

四天学会JS高阶(学好vue的关键)——作用域解构箭头函数(理论+实战)(第一天)

一、作用域 提到作用域&#xff08;作用域又分为局部作用域和全局作用域&#xff09;&#xff0c;就要想到变量。因为作用域规定了变量能够被访问的范围&#xff08;也就是作用域是为变量而服务的&#xff09;&#xff0c;为了避免全局变量污染这一情况&#xff0c;所以需要使…

ollama离线部署llama3(window系统)

首先介绍下ollama是什么&#xff1f;Ollama是一个开源的大型语言模型服务工具&#xff0c;旨在为用户提供本地化的运行环境&#xff0c;满足个性化的需求。具体来说&#xff0c;Ollama是一个功能强大的开源框架&#xff0c;可以简化在Docker容器中部署和管理大型语言模型&a…

leetcode算法笔记-算法复杂度

对于时间复杂度&#xff0c;主要包括三种情况&#xff1a; 渐进紧确界&#xff1a; O渐进上界&#xff1a; 渐进下界&#xff1a; 加法原则&#xff1a;不同的时间复杂度相加取阶数最高的 乘法原则&#xff1a;不同的时间复杂度相乘&#xff0c;结果为时间复杂度的乘积 阶乘…

计算机vcruntime140.dll找不到如何修复,分享5种靠谱的修复教程

当您在运行某个应用程序或游戏时遇到提示“找不到vcruntime140.dll”&#xff0c;这通常意味着系统中缺少了Visual C Redistributable for Visual Studio 2015或更高版本的一个重要组件。这个错误通常发生在运行某些程序时&#xff0c;系统无法找到所需的动态链接库文件。小编将…

SwiftUI中的常用图形(Shapes)

概述 在SwiftUI中&#xff0c;常用的图形&#xff08;Shape&#xff09;主要有&#xff1a; Circle&#xff1a;圆形 Ellipse&#xff1a;椭圆形 Capsule&#xff1a;胶囊形 Rectangle&#xff1a;矩形 RoundedRectangle&#xff1a;圆角矩形 上面的这些图形都继承了Shape协议…

ssl证书免费申请指南

同学们可以私信我加入学习群&#xff01; 正文开始 前言一、购买证书二、创建证书三、 验证证书等待出现如下页面&#xff0c;说明申请成功&#xff1a; ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6b6c1dd11d4c467687318552da7cdbb2.png) 总结 前言 今天为大…

28、查看Qt源码

一、方法1 在安装Qt时&#xff0c;需要勾选“Sources” 在Qt的安装目录Qt5.12.10\5.12.10\Src中可以找到Qt的源码 二、方法2 访问如下网址&#xff08;需要翻墙&#xff09; https://codebrowser.dev/ 在搜索框中输入要查找的信息&#xff0c;如&#xff1a;QMainWindow&…

C++自定义日期类的精彩之旅(详解)

在学习了C的6个默认成员函数后&#xff0c;我们现在动手实现一个完整的日期类&#xff0c;来加强对这6个默认成员函数的认识。 这是日期类中所包含的成员函数和成员变量&#xff1a; 构造函数 // 函数&#xff1a;获取某年某月的天数 inline int GetMonthDay(int yea…

嵌入式学习-M4的基本定时器

基本介绍 框图分析 时钟选择 计数器结构 开启重装载值寄存器的影子寄存器的工作时序图 未开启重装载值寄存器的影子寄存器的工作时序图 更新事件以及中断 相关寄存器 相关库函数

原子学习笔记7——FrameBuffer 应用编程

Frame 是帧的意思&#xff0c;buffer 是缓冲的意思&#xff0c;所以 Framebuffer 就是帧缓冲&#xff0c;这意味着 Framebuffer 就是一块内存&#xff0c;里面保存着一帧图像。 应用程序通过对 LCD 设备节点/dev/fb0&#xff08;假设 LCD 对应的设备节点是/dev/fb0&#xff09;…

Optional用法

说明&#xff1a;Optional和Stream一样&#xff0c;是Java8引入的特性&#xff0c;本文介绍Optional的几个实际用法。Steam流使用&#xff0c;参考下面这篇文章&#xff1a; Stream流使用 使用 1.保证值存在 // 1.保证值存在&#xff0c;pageNumber&#xff0c;pageSizeInte…

Zab之光:照亮分布式系统数据一致性迷宫的智慧火把

关注微信公众号 “程序员小胖” 每日技术干货&#xff0c;第一时间送达&#xff01; 引言 在构建大型分布式系统时&#xff0c;数据一致性是我们必须面对的挑战之一。随着业务的增长和系统规模的扩大&#xff0c;如何保证在多个节点间复制的数据保持一致&#xff0c;成为了一…

iOS--底层学习--GCD的简单认识

iOS--底层学习--GCD的简单认识 前言什么是GCDGCD的优点GCD中的任务和队列任务队列 GCD的使用队列的创建和获取任务的创建队列嵌套任务和队列中的一些要点 GCD线程间的通信从后台线程切换到主线程通过队列传递数据使用Dispatch Group进行线程间协调 GCD的方法dispatch_barrier_a…

其它高阶数据结构①_并查集(概念+代码+两道OJ)

目录 1. 并查集的概念 2. 并查集的实现 3. 并查集的应用 3.1 力扣LCR 116. 省份数量 解析代码1 解析代码2 3.2 力扣990. 等式方程的可满足性 解析代码 本篇完。 写在前面&#xff1a; 此高阶数据结构系列&#xff0c;虽然放在⑤数据结构与算法专栏&#xff0c;但还是作…

Output directory is not specified

场景&#xff1a;从GitHub拉取Java项目使用IDEA打开运行的时候抛出 java: 写入com.common.exception.ChatException时出错: Output directory is not specified网上大部分是说在项目结构增加编译器输出路径&#xff0c;但我在实际开发的项目的时候这里为空&#xff0c;包括我加…