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

算法Day-9

541. 反转字符串 II

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。
  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

示例 1:

输入:s = "abcdefg", k = 2
输出:"bacdfeg"

示例 2:

输入:s = "abcd", k = 2
输出:"bacd"

提示:

  • 1 <= s.length <= 104
  • s 仅由小写英文组成
  • 1 <= k <= 104

本题需要读懂题意,主要是当数组到达2k就反转前k个字符,如果字符少于 k 个,则将剩余字符全部反转,先对数组进行循环,并i一次增加2k,当i =0时判断i+k是否小于数组长度如果小于说明可以反转前k个,否则说明前k个字符多于数组剩余字符,就将剩余全部反转。

public class Solution {
    public string ReverseStr(string s, int k) {
        char[] arr = s.ToCharArray();
        for(int i = 0;i<arr.Length;i+=2*k){
            if(i+k<=arr.Length){
                Array.Reverse(arr,i,k);
            }else{
                Array.Reverse(arr,i,arr.Length-i);
            }
        }
        return new string(arr);
    }
}

151. 反转字符串中的单词

已解答

中等

相关标签

相关企业

给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

示例 1:

输入:s = "the sky is blue"
输出:"blue is sky the"

示例 2:

输入:s = "  hello world  "
输出:"world hello"
解释:反转后的字符串中不能存在前导空格和尾随空格。

示例 3:

输入:s = "a good   example"
输出:"example good a"
解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。
public class Solution {
    public string ReverseWords(string s) {
        // 步骤 1: 初始化指针和变量
        int fast = 0; // 快指针,用于遍历字符串
        int slow = 0; // 慢指针,用于构建最终结果
        bool need = false; // 标记是否需要插入空格
        
        // 步骤 2: 复制非空格字符并减少空格
        char[] result = new char[s.Length]; // 使用字符数组来存储清理后的结果

        for (; fast < s.Length; fast++) {
            if (s[fast] != ' ') {
                result[slow++] = s[fast]; // 复制非空格字符
                need = true; // 标记需要插入空格
            } else if (need) {
                result[slow++] = ' '; // 在需要的情况下添加一个空格
                need = false; // 重置需要空格的标记
            }
        }

        // 步骤 3: 移除尾随空格(如果有)
        if (slow > 0 && result[slow - 1] == ' ') {
            slow--; // 如果最后一个字符是空格,减少慢指针以移除尾随空格
        }

        // 步骤 4: 反转整个数组
        ReverseArray(result, 0, slow - 1); // 反转清理后的字符数组

        // 步骤 5: 逐个反转每个单词
        int start = 0; // 记录每个单词的起始位置
        for (int i = 0; i <= slow; i++) {
            if (i == slow || result[i] == ' ') {
                ReverseArray(result, start, i - 1); // 反转当前单词
                start = i + 1; // 移动到下一个单词的起始位置
            }
        }

        // 步骤 6: 将字符数组转换为字符串并返回
        return new string(result, 0, slow); // 只返回有效字符部分
    }

    // 辅助方法:反转字符数组的一部分
    private void ReverseArray(char[] arr, int left, int right) {
        while (left < right) {
            char temp = arr[left]; // 交换字符
            arr[left] = arr[right];
            arr[right] = temp;
            left++; // 移动左指针
            right--; // 移动右指针
        }
    }
}


http://www.kler.cn/news/368988.html

相关文章:

  • 网络学习/复习2套接字
  • 高效网络自动化:Python在网络基础中的应用
  • Spring-SpringMVC-SpringBoot理解
  • 分库分表常见面试问题
  • Python之Excel自动化处理(三)
  • 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-21
  • 66.基于DDR3 SDRAM的HDMI图像显示
  • 第1次CCF CSP认证真题解
  • 华为配置BFD状态与接口状态联动实验
  • 【C++】构造函数冒号后面的初始化列表使用小括号( )和大括号{ }的区别(回子的四种写法)
  • 高效思维管理:2024年必备在线思维导图软件!
  • C++初阶学习第八弹--深入解析vector的使用
  • 防火墙防御体系结构类型
  • uniapp开发小程序【点击头像实现更改头像、上传头像】
  • 【Linux】MyCat分库分表|读写分离
  • docker的持久化
  • QT:MaintenanceTool 模块安装工具
  • 快速对比:Django、Spring Boot、Node.js 和 PHP
  • 软件测试学习笔记丨Selenium学习笔记:元素定位与操作
  • Matlab的安装和破解
  • 【Pip】深入理解 Python 中的 pip 虚拟环境
  • App测试环境部署
  • 利用Spring Boot框架开发酒店住宿管理应用
  • 【论文阅读】jina-embeddings-v3: Multilingual Embeddings With Task LoRA
  • ChatGPT:从发布到全球大热,仅用一年多的传奇之旅
  • 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-23