leetcode443–压缩字符串(双指针/简单)

简介: leetcode443–压缩字符串(双指针/简单)

给你一个字符数组 chars ,请使用下述算法压缩:


从一个空字符串 s 开始。对于 chars 中的每组 连续重复字符 :


如果这一组长度为 1 ,则将字符追加到 s 中。

否则,需要向 s 追加字符,后跟这一组的长度。

压缩后得到的字符串 s 不应该直接返回 ,需要转储到字符数组 chars 中。需要注意的是,如果组长度为 10 或 10 以上,则在 chars 数组中会被拆分为多个字符。


请在 修改完输入数组后 ,返回该数组的新长度。


你必须设计并实现一个只使用常量额外空间的算法来解决此问题。


在内部直接修改,不会影响到后面的

int compress(char* chars, int charsSize){
    int index = 0;
    int i,j;
    printf("%c",chars[index]);
    for(i = 0;i < charsSize;)
    {
        // if(i == charsSize-1)
        // {
            // chars[index] = chars[i];
            // break;
        // }
        j = i+1;
        while(j < charsSize && chars[j] == chars[i])  //曾经的考点咋都忘了 &&前后条件不能交换顺序 因为要先判断越界 !!
        {
            j++;
        }
        if(j-i > 1)
        {
            chars[index++] = chars[i];
            int d = j-i;
            int d_index = 0;
            int arr[5];
            while(d > 0)
            {
                arr[d_index] = d%10;
                d = d/10;
                d_index++;
            } //保存好多个重复的时候 12个 要存‘1’,‘2’
            printf("%c",(j-i)+'0');
            while(d_index--)
            {
                chars[index++] = arr[d_index]+'0';
            }
            // chars[index++] = (j-i)+'0';
            printf("%c",chars[index-1]);
        }
        else if(j-i == 1)
        {
            chars[index++] = chars[i];
        }
        if(j == charsSize)
        {
            break;
        }
        i = j;
    }
    charsSize = index;
    return charsSize;
}
相关文章
|
7月前
|
Go 索引
【LeetCode 热题100】394:字符串解码(详细解析)(Go语言版)
本文详细解析了 LeetCode 热题 394:字符串解码。题目要求对编码字符串如 `k[encoded_string]` 进行解码,其中 `encoded_string` 需重复 `k` 次。文章提供了两种解法:使用栈模拟和递归 DFS,并附有 Go 语言实现代码。栈解法通过数字栈与字符串栈记录状态,适合迭代;递归解法则利用函数调用处理嵌套结构,代码更简洁。两者时间复杂度均为 O(n),但递归需注意栈深度问题。文章还总结了解题注意事项及适用场景,帮助读者更好地掌握字符串嵌套解析技巧。
202 6
|
8月前
|
存储 机器学习/深度学习 缓存
🚀 力扣热题 394:字符串解码(详细解析)(Go语言版)
文章提供了两种解法:栈结构和递归解法。栈解法通过维护数字栈与字符串栈,依次处理 `[` 和 `]`,构造解码结果;递归解法则利用函数调用逐层解析嵌套结构。两者时间复杂度均为 $O(n)$,空间复杂度也为 $O(n)$。栈解法直观易懂,适合初学者;递归解法优雅简洁,适合处理深度嵌套规则。掌握这两种方法,可灵活应对类似问题,提升解题能力。
285 11
|
11月前
|
算法 容器
【算法】——双指针算法合集(力扣)
移动零,复写零,快乐数,盛最多水的容器,有效三角形的个数,和为s的两个数(查找总价格为目标值的两个商品 ),三数之和,四数之和
|
C++
Leetcode第43题(字符串相乘)
本篇介绍了一种用C++实现的字符串表示的非负整数相乘的方法,通过逆向编号字符串,将乘法运算转化为二维数组的累加过程,最后处理进位并转换为字符串结果,解决了两个大数相乘的问题。
119 9
|
JavaScript
力扣3333.找到初始输入字符串Ⅱ
【10月更文挑战第9天】力扣3333.找到初始输入字符串Ⅱ
161 1
|
算法 C++
Leetcode第八题(字符串转换整数(atoi))
这篇文章介绍了LeetCode上第8题“字符串转换整数(atoi)”的解题思路和C++的实现方法,包括处理前导空格、正负号、连续数字字符以及整数溢出的情况。
174 0
【LeetCode 22】459.重复的子字符串
【LeetCode 22】459.重复的子字符串
133 0
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
1110 13
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
487 4
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
166 0