C C++ 题解LeetCode1417重新格式化字符串

C/C++ 题解 LeetCode 1417 重新格式化字符串

题目描述

给定一个由字母、数字和空格组成的字符串 s,你需要将其重新格式化,使得任意两个相邻字符之间都有且仅有一个空格,并且首尾字符之间也不能有空格。

返回 重新格式化后的字符串,如果无法按要求重新格式化,则返回一个 空字符串

示例说明

示例 1

输入:s = "a0b1c2"
输出:"a 0b 1c 2"
解释:没有任何两个相邻字符之间可以插入一个空格。

示例 2

输入:s = "leetcode"
输出:""
解释:"leetcode" 中没有空格,所以无法满足重新格式化的条件。

示例 3

输入:s = "1229857369"
输出:""

解释:"1229857369" 中数字之间连续,所以无法满足重新格式化的条件。

示例 4

输入:s = "covid2019"
输出:"c o v i d 2 0 1 9"

解释:s 中相邻字符之间都需要插入一个空格。

算法实现

  1. 将字符串 s 中的字母和数字都保存到两个不同的数组中。

char letters[101], digits[101];
int numLetters = 0, numDigits = 0;

        for (int i = 0; i < s.length(); i++) {
            if (s[i] >= 'a' && s[i] <= 'z')
                letters[numLetters++] = s[i];
            else if (s[i] >= '0' && s[i] <= '9')
                digits[numDigits++] = s[i];
        }

  1. 根据字母、数字数组的长度,判断是否可以满足重新格式化要求。
  2. 当字母和数字数组的长度之差的绝对值超过 1 时,无法满足重新格式化要求,返回空字符串。
  3. 当字母数组的长度等于数字数组的长度时,交替插入字母和数字即可。
  4. 当字母数组的长度大于数字数组的长度时,先插入字母,然后在末尾插入一次数字即可。
  5. 当字母数组的长度小于数字数组的长度时,先插入数字,然后在末尾插入一次字母即可。

int sizeDiff = numLetters - numDigits;
        if (sizeDiff > 1 || sizeDiff < -1) // 长度差大于 1 时无法重新格式化
            return "";
        int totalSize = numLetters + numDigits;
        int letterIndex = 0, digitIndex = 0;
        bool firstIsLetter = numLetters > numDigits ? true : false;
        for (int i = 0; i < totalSize; i++) {
            if (firstIsLetter) {
                if (i % 2 == 0)
                    result += letters[letterIndex++];
                else
                    result += digits[digitIndex++];
            } else {
                if (i % 2 == 0)
                    result += digits[digitIndex++];
                else
                    result += letters[letterIndex++];
            }
        }

        if (numLetters == numDigits && firstIsLetter) // 字母和数字数量相同时的特殊处理
            result.insert(1, " ");
        else if (numLetters == numDigits && !firstIsLetter)
            result.insert(0, " ");
        else if (firstIsLetter)
            result.insert(result.length(), 1, digits[digitIndex]); // 数字数量小于字母数量时的特殊处理
        else
            result.insert(0, 1, letters[letterIndex]);

完整代码

class Solution {
public:
    string reformat(string s) {
        string result = "";
        char letters[101], digits[101];
        int numLetters = 0, numDigits = 0;

        for (int i = 0; i < s.length(); i++) {
            if (s[i] >= 'a' && s[i] <= 'z')
                letters[numLetters++] = s[i];
            else if (s[i] >= '0' && s[i] <= '9')
                digits[numDigits++] = s[i];
        }

        int sizeDiff = numLetters - numDigits;
        if (sizeDiff > 1 || sizeDiff < -1)
            return "";
        int totalSize = numLetters + numDigits;
        int letterIndex = 0, digitIndex = 0;
        bool firstIsLetter = numLetters > numDigits ? true : false;
        for (int i = 0; i < totalSize; i++) {
            if (firstIsLetter) {
                if (i % 2 == 0)
                    result += letters[letterIndex++];
                else
                    result += digits[digitIndex++];
            } else {
                if (i % 2 == 0)
                    result += digits[digitIndex++];
                else
                    result += letters[letterIndex++];
            }
        }

        if (numLetters == numDigits && firstIsLetter)
            result.insert(1, " ");
        else if (numLetters == numDigits && !firstIsLetter)
            result.insert(0, " ");
        else if (firstIsLetter)
            result.insert(result.length(), 1, digits[digitIndex]);
        else
            result.insert(0, 1, letters[letterIndex]);

        return result;
    }
};

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C C++ 题解LeetCode1417重新格式化字符串 - Python技术站

(0)
上一篇 2023年5月24日
下一篇 2023年5月24日

相关文章

  • 一起来学习C语言的程序环境与预处理

    让我来详细讲解一下“一起来学习C语言的程序环境与预处理”的完整攻略。 程序环境的搭建 安装编译器 首先,我们需要选择一款适合自己的C语言编译器。常见的编译器有: GCC:开源免费的编译器,支持多种操作系统,功能强大。 MSVC:微软公司开发的编译器,适合在Windows操作系统上使用。 Clang:基于LLVM架构的编译器,支持各种操作系统,编译速度快。 在…

    C 2023年5月23日
    00
  • c/c++单例模式类的混合编译案例详解

    针对“c/c++单例模式类的混合编译案例详解”的完整攻略,以下是我所能提供的两个实际示例说明: 示例1:单例模式类的C++实现 文件结构 – singleton_cpp |- singleton.hpp |- singleton.cpp |- main.cpp 代码实现 singleton.hpp 文件定义了一个单例模式类 Singleton,代码如下: #…

    C 2023年5月23日
    00
  • C语言实现随机抽取纸牌程序

    下面我会详细讲解“C语言实现随机抽取纸牌程序”的完整攻略,过程中也会提供两个示例说明。 随机生成整副牌 首先,我们需要随机生成一整副牌。在C语言中,我们可以用一个长度为52的数组来表示整副牌,根据花色和点数生成每张牌。 int deck[52]; int i, j, k; for (i = 0; i < 4; i++) { for (j = 0; j …

    C 2023年5月22日
    00
  • C语言快速实现扫雷小游戏

    C语言快速实现扫雷小游戏攻略 介绍 扫雷是一款经典的小游戏,以其简单的规则和极高的可玩性深受玩家喜爱。在此,将介绍如何使用C语言快速实现扫雷小游戏。 实现思路 扫雷游戏的主要逻辑是实现格子的打开、插旗和计算数字等操作。因此需要设计一个二维数组来表示游戏界面,并将每个格子分成以下几种类型: 雷格:表示该格子下面是一颗地雷; 数字格:表示该格子周围有多少颗地雷;…

    C 2023年5月23日
    00
  • C程序 查找姓名首字母

    下面是C程序“查找姓名首字母”的完整使用攻略! 程序概述 本程序的主要功能是在用户输入的名字中,查找给定首字母的姓名。具体实现方式为,读取用户输入的姓名,然后用循环逐一比较每个姓名的首字母,最后输出符合要求的姓名。本程序具有较好的通用性,可用于各种名字查找场景。 程序使用方法 下载并安装C编译器:如Turbo C、VS等,以便编译运行程序。 打开编译器,打开…

    C 2023年5月9日
    00
  • win10系统下 VS2019点云库PCL1.12.0的安装与配置教程

    下面是在Win10系统下安装VS2019和PCL1.12.0库的完整攻略: 准备工作 安装Visual Studio 2019 安装CMake 安装PCL1.12.0 访问PCL官网(https://pointclouds.org/downloads/)下载点云库PCL的最新版1.12.0。 解压下载的文件到任意目录(以C:/Program Files (x…

    C 2023年5月23日
    00
  • shell 通过makefile传参给c语言的实现示例

    下面是详细讲解 shell 通过 makefile 传参给 C 语言的实现示例的完整攻略: 1. 确定传参的方式 命令行参数:在程序执行时,可以通过命令行传入参数,使用 main() 函数中的 argc 和 argv 进行接收; 环境变量:通过设置和获取环境变量,来传递参数; 读取配置文件:在程序运行前读取配置文件,将需要的参数传入程序中; Makefile…

    C 2023年5月23日
    00
  • Golang哈希算法实现配置文件的监控功能详解

    Golang哈希算法实现配置文件的监控功能详解 介绍 在开发中,经常需要读取配置文件来动态调整运行时参数。为了及时更新配置文件的修改,我们需要实现一个能够监控配置文件变化并自动加载的功能。本文介绍使用 Golang 哈希算法实现配置文件监控的方法。 哈希算法介绍 哈希算法是一种将任意长的消息压缩到某一固定长度的消息摘要的函数。摘要的意义在于保证数据的完整性,…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部