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

每日一题——字符串变形

字符串变形

    • 题目描述
      • 数据范围
      • 要求
    • 示例
      • 示例1
      • 示例2
      • 示例3
    • 解题思路
    • 代码实现
    • 复杂度分析
    • 相关要点

题目描述

对于一个长度为 n 的字符串,需要进行以下变形操作:

  1. 将字符串中由空格隔开的单词反序排列
  2. 反转每个字符的大小写

数据范围

  • 1 ≤ n ≤ 10^6
  • 字符串中只包括大写英文字母、小写英文字母、空格

要求

  • 空间复杂度:O(n)
  • 时间复杂度:O(n)

示例

示例1

输入:"This is a sample",16
输出:"SAMPLE A IS tHIS"

示例2

输入:"nowcoder",8
输出:"NOWCODER"

示例3

输入:"iOS",3
输出:"Ios"

解题思路

  1. 整体思路:

    • 先将整个字符串反转
    • 遍历字符串,对每个字符进行大小写转换
    • 对每个单词进行反转
  2. 具体步骤:

    • 定义一个反转函数 reverse,用于反转字符串指定区间的字符
    • 先将整个字符串反转
    • 遍历字符串:
      • 遇到非空格字符时,转换大小写
      • 遇到空格时,反转前面的单词
    • 处理最后一个单词

代码实现

void reverse(char* s, int head, int tail) {
    while (head < tail) {
        char temp = s[head];       // 保存头部字符
        s[head] = s[tail];         // 将尾部字符移到头部
        s[tail] = temp;            // 将保存的头部字符移到尾部
        head++;                    // 头部指针向右移动
        tail--;                    // 尾部指针向左移动
    }
}
char* trans(char* s, int n) {
    if (n == 0)
        return "";                 // 如果字符串长度为0,直接返回空字符串
    // 先将整个字符串反转
    reverse(s, 0, n - 1);
        int j = 0, i;                  // j 用于记录单词的长度,i 用于遍历字符串
    int mark;                      // mark 用于记录最后一个空格的位置

    // 遍历处理每个字符
    for (i = 0; i < n; i++) {
        if (s[i] != ' ') {         // 如果当前字符不是空格
            // 转换大小写
            if (s[i] >= 'a' && s[i] <= 'z') {
                s[i] = s[i] - 32;  // 小写转大写(ASCII 码差值为32)
            } else {
                s[i] = s[i] + 32;  // 大写转小写
            }
            j++;                   // 单词长度加1
        } else {                   // 如果遇到空格
            // 遇到空格,反转前面的单词
            reverse(s, i - j, i - 1); // 反转当前单词
            j = 0;                 // 重置单词长度
            mark = i;              // 记录空格位置
        }
    }
        // 处理边界情况
    if (i == j) {                  // 如果整个字符串是一个单词(没有空格)
        reverse(s, 0, n - 1);      // 反转整个单词
    }
    if (mark != 0) {               // 如果字符串中有空格
        reverse(s, mark + 1, n - 1); // 反转最后一个单词
    }
        return s;                      // 返回处理后的字符串
}

复杂度分析

  • 时间复杂度:O(n)
    • 整体反转一次:O(n)
    • 遍历处理字符:O(n)
    • 单词反转:每个字符最多被反转两次,O(n)
  • 空间复杂度:O(1)
    • 只使用了常数额外空间

相关要点

  1. 字符串处理技巧

    • 使用双指针进行字符串反转
    • ASCII码转换实现大小写转换
    • 空格作为单词分隔符的处理
  2. 边界情况处理

    • 空字符串的处理
    • 只有一个单词的情况
    • 最后一个单词的处理

相关文章:

  • 如何生成美观且内容稳定的PDF文档:从基础到进阶的全方案解析
  • Datawhale Ollama教程笔记5
  • Rust编程语言入门教程 (七)函数与控制流
  • 什么是LoRA微调
  • SpringBoot详解
  • 使用爬虫按关键字搜索亚马逊商品:实战指南
  • AWS-SAA中文版题库
  • 【c语言初阶】函数_递归和迭代
  • 计算机专业知识【深入理解 IP 地址与子网掩码:从 /27 到不同 CIDR 表示】
  • PyTorch 源码学习:Dispatch Autograd Operators
  • 《炒股养家心法.pdf》 kimi总结
  • 京东cfe滑块 分析
  • 在VSCode中接入deepseek
  • 优化YOLOv8:如何利用ODConv卷积解决复杂背景下的目标识别问题
  • 为什么要用 const 和 let,而不是 var?
  • Solon Cloud —— 介绍
  • Pytorch实现之GIEGAN(生成器信息增强GAN)训练自己的数据集
  • The First项目报告:重塑链上游戏生态,解读B3 Base的双赢局面
  • 操作系统研究
  • 新版Tomcat MySQL IDEA 安装配置过程遇到的问题
  • 网站开发后端/网络营销sem培训
  • 群晖nda做网站/seo排名优化联系13火星软件
  • 自己做众筹网站/app广告联盟平台
  • 为什么网站用静态页面/品牌战略
  • 各类网站建设/最基本的网站设计
  • 六盘水市网站建设/网站开发用什么语言