【Leetcode】面试题 01.06. 字符串压缩、面试题 05.07. 配对交换

简介: 目录面试题 01.06. 字符串压缩: 面试题 05.07. 配对交换

作者:一个喜欢猫咪的的程序员

专栏:《Leetcode》

喜欢的话:世间因为少年的挺身而出,而更加瑰丽。                                  ——《人民日报》


目录

面试题 01.06. 字符串压缩:

面试题 05.07. 配对交换


面试题 01.06. 字符串压缩

https://leetcode.cn/problems/compress-string-lcci/

题目描述:

字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。

示例:


思路:

开辟一个数组tmp(大小为S的大小x2+1),每次先将字符先存进去,计算每个字符的个数,然后存进去,个数存进去的细节可以注意看看注释,注释较为详细。

代码:

char* compressString(char* S) {
    char* tmp = (char*)malloc(sizeof(char) * (2 * strlen(S) + 1));
    int cur = 0;//用来遍历S的下标
    int n = 0;//用来赋值tmp和S的下标
    while (cur < strlen(S))
    {
        int num = 1;
        tmp[n++] = S[cur];
        int i = cur;//算每个字符的个数
        while (i < strlen(S))
        {
            if (tmp[n - 1] != S[i + 1])
            {
                break;
            }
            i++;
            num++;
        }
        char s = '0';
        if (num > 9)
        {//放在num>9,求余
            int a = 0;
            while (num > pow(10, a))
                a++;//4934,a=4
            if (num % (int)pow(10, a - 1) == 0)
                a--;
            if (num < pow(10, a))
                a--;
            int m = num;
            while (m > 0)
            {
                if (m / (int)pow(10, a) > 9)//防止除完这个数大于9
                    tmp[n++] = s + (m / pow(10, a) - 9);
                else 
                tmp[n++] = s + (m / pow(10, a));
                m = m % (int)pow(10, a--);
            }
            if(num % 10==0)
            tmp[n++] = s + (num % 10);
        }
        else
            tmp[n++] = s + num;
        cur += num;
    }
    tmp[n] = '\0';
    if (strlen(S) <= strlen(tmp))
        return S;
    return tmp;
}


面试题 05.07. 配对交换

https://leetcode.cn/problems/exchange-lcci/

题目描述:

配对交换。编写程序,交换某个整数的奇数位和偶数位,尽量使用较少的指令(也就是说,位0与位1交换,位2与位3交换,以此类推)。

示例:

代码:

int exchangeBits(int num){
        int a2=0x55555555;
        int a1=0x2aaaaaaa;
        a1=num&a1;//保留奇数位,偶数位一定为0
        a2=num&a2;//保留偶数位,奇数位一定为0
        a2=a2<<1;//偶数变奇数.
        a1=a1>>1;//奇数位边偶数
        return a1|a2;
}
相关文章
|
10月前
|
Go 索引
【LeetCode 热题100】394:字符串解码(详细解析)(Go语言版)
本文详细解析了 LeetCode 热题 394:字符串解码。题目要求对编码字符串如 `k[encoded_string]` 进行解码,其中 `encoded_string` 需重复 `k` 次。文章提供了两种解法:使用栈模拟和递归 DFS,并附有 Go 语言实现代码。栈解法通过数字栈与字符串栈记录状态,适合迭代;递归解法则利用函数调用处理嵌套结构,代码更简洁。两者时间复杂度均为 O(n),但递归需注意栈深度问题。文章还总结了解题注意事项及适用场景,帮助读者更好地掌握字符串嵌套解析技巧。
283 6
|
11月前
|
存储 机器学习/深度学习 缓存
🚀 力扣热题 394:字符串解码(详细解析)(Go语言版)
文章提供了两种解法:栈结构和递归解法。栈解法通过维护数字栈与字符串栈,依次处理 `[` 和 `]`,构造解码结果;递归解法则利用函数调用逐层解析嵌套结构。两者时间复杂度均为 $O(n)$,空间复杂度也为 $O(n)$。栈解法直观易懂,适合初学者;递归解法优雅简洁,适合处理深度嵌套规则。掌握这两种方法,可灵活应对类似问题,提升解题能力。
369 11
|
C++
Leetcode第43题(字符串相乘)
本篇介绍了一种用C++实现的字符串表示的非负整数相乘的方法,通过逆向编号字符串,将乘法运算转化为二维数组的累加过程,最后处理进位并转换为字符串结果,解决了两个大数相乘的问题。
133 9
|
JavaScript
力扣3333.找到初始输入字符串Ⅱ
【10月更文挑战第9天】力扣3333.找到初始输入字符串Ⅱ
187 1
LeetCode第24题两两交换链表中的节点
这篇文章介绍了LeetCode第24题"两两交换链表中的节点"的解题方法,通过使用虚拟节点和前驱节点技巧,实现了链表中相邻节点的交换。
LeetCode第24题两两交换链表中的节点
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
168 0
LeetCode第二十四题(两两交换链表中的节点)
|
存储 NoSQL Redis
Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList
String类型底层数据结构,List类型全面解析,ZSet底层数据结构;简单动态字符串SDS、压缩列表ZipList、哈希表、跳表SkipList、整数数组IntSet
|
开发者 索引 Python
这些年背过的面试题——LeetCode
本文是技术人面试系列LeetCode篇,一文带你详细了解,欢迎收藏!
|
算法 C++
Leetcode第八题(字符串转换整数(atoi))
这篇文章介绍了LeetCode上第8题“字符串转换整数(atoi)”的解题思路和C++的实现方法,包括处理前导空格、正负号、连续数字字符以及整数溢出的情况。
257 0
【LeetCode 22】459.重复的子字符串
【LeetCode 22】459.重复的子字符串
155 0