字符串内容重排

使用C语言,编写函数,实现对给定的字符串(包含英文字母、数字、符号)的处理,经处理的字符串按照字母、数字、符号的顺序排放,顺序不变。

思路1:先统计字母、数字、符号的个数,假设分别为a,b,c,字符串总长度是d,那么字母下标分布应该是:[0, a-1],数字下标分布应该是:[a, a+ b- 1],符号下标分布应该是:[a+ b, d - 1]。定义一个临时空间,拷贝原字符串到这个临时空间,然后遍历临时空间,按照下标分布赋值到源字符串对应位置。这个方法较容易理解和实现。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int reorder_str1(char* pStr)
{
    //统计字母、数字、符号的个数
    int nLetterCnt = 0;
    int nDigitCnt = 0;
    int nStrLen = strlen(pStr);
    for (int i = 0; i < nStrLen; ++i) {
        if ((pStr[i] >= 'a' && pStr[i] <= 'z') || (pStr[i] >= 'A' && pStr[i] <= 'Z')) {
            ++nLetterCnt;
        }
        else if (pStr[i] >= '0' && pStr[i] <= '9') {
            ++nDigitCnt;
        }
    }

    char* pTmpStr = (char *)malloc(nStrLen);
    if (pTmpStr == NULL) {
        return -1;
    }
    strcpy(pTmpStr, pStr);

    //字母下标取值:[0, nLetterCnt -1]
    //数字下标取值:[nLetterCnt, nLetterCnt + nDigitCnt - 1]
    //符号下标取值:[nLetterCnt + nDigitCnt, nStrLen - 1]
    int nLetterIndex = 0;
    int nDigitIndex = nLetterCnt;
    int nOtherIndex = nLetterCnt + nDigitCnt;
    for (int i = 0; i < nStrLen; ++i) {
        if ((pTmpStr[i] >= 'a' && pTmpStr[i] <= 'z') || (pTmpStr[i] >= 'A' && pTmpStr[i] <= 'Z')) {
            pStr[nLetterIndex++] = pTmpStr[i];
        }
        else if (pTmpStr[i] >= '0' && pTmpStr[i] <= '9') {
            pStr[nDigitIndex++] = pTmpStr[i];
        }
        else {
            pStr[nOtherIndex++] = pTmpStr[i];
        }
    }

    free(pTmpStr);
    return 0;
}

int main()
{
    //A,2.d?3!e4r87we79 --> Aderwe2348779,.?!
    char szBuf[32] = { 0 };
    strcpy(szBuf, "A,2.d?3!e4r87we79");
    printf("Before szBuf=[%s]\n", szBuf);
    reorder_str1(szBuf);
    printf("After  szBuf=[%s]\n", szBuf);
    return 0;
}

在VS2019上运行free(pTmpStr)会报错,具体原因没有深究。调整程序在CentOS7.8编译运行,因为for (int i = 0; i < nStrLen; ++i)的原因,再CentOS7.8下面得加上-std=c99编译,编译命令如下gcc -std=c99 -o test test.c,程序运行结果如下:

 

### 字符串重排算法的Python实现 在Python中,可以通过多种方式来处理字符串重排问题。这里介绍一种常见的方法用于判断给定字符串是否能通过重新排列形成回文,并给出具体实例。 对于这个问题的核心在于计算各个字符出现频率并分析其奇偶性。如果超过一个字符出现了奇数次,则无法构成回文;反之则可以[^1]。下面是一个具体的函数定义: ```python def can_form_palindrome(s: str) -> bool: char_count = {} # 统计各字符的数量 for c in s: if c not in char_count: char_count[c] = 0 char_count[c] += 1 odd_counts = sum(1 for count in char_count.values() if count % 2 != 0) return odd_counts <= 1 ``` 上述代码片段展示了如何利用字典`char_count`记录输入字符串`s`内每种字符的数量。接着遍历这些值以确定有多少个字符具有奇数个副本。当且仅当至多有一个这样的字符存在时,才认为该字符串能够被重组为回文形式。 另外,在实际应用过程中可能还会遇到其他类型的字符串重排需求,比如按照特定规则排序后的输出。此时可借助于标准库模块`collections.Counter()`来进行高效的数据收集工作,再配合自定义比较逻辑完成最终的结果展示[^2]。 最后值得注意的是,针对某些特殊场景下的优化策略也非常重要。例如为了提高效率减少不必要的重复运算,可以在适当位置加入剪枝操作提前终止无意义分支探索过程[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值