将一个字符串重复自身N次

        function repeat(target,n){
            return Array.prototype.join.call({length: n + 1} , target);
        }

repeat('str',2);//输出strstr

转载于:https://www.cnblogs.com/violinxliu/p/3834848.html

发布2个字符串处理函数: 1、ParameterValue() 2、ParameterCount() 用法示例: dim TheString as String TheString="欢迎,光临,枕善居,源代码" msgbox ParameterCount(",",TheString) 返回 4 ParameterValue(",",TheString,2) 返回 "欢迎" Public Function ParameterCount(ParseCharacter As String, _ tString As Variant) As Integer Dim CurrentPosition As Integer Dim ParseToPosition As Integer Dim CurrentToken As Integer Dim TempString As String TempString = Trim(tString) + ParseCharacter If Len(TempString) = 1 Then Exit Function CurrentPosition = 1 CurrentToken = 1 Do ParseToPosition = InStr(CurrentPosition, TempString, _ ParseCharacter) CurrentToken = CurrentToken + 1 CurrentPosition = ParseToPosition + 1 Loop Until (CurrentPosition >= Len(TempString)) ParameterCount = CurrentToken - 1 End Function Public Function ParameterValue(ParseCharacter As String, _ tString As Variant, _ Index As Integer) As String Dim CurrentPosition As Integer Dim ParseToPosition As Integer Dim CurrentToken As Integer Dim TempString As String TempString = Trim(tString) + ParseCharacter If Len(TempString) = 1 Then Exit Function CurrentPosition = 1 CurrentToken = 1 Do ParseToPosition = InStr(CurrentPosition, TempString, _ ParseCharacter) If Index = CurrentToken Then ParameterValue = Mid$(TempString, CurrentPosition, _ ParseToPosition - CurrentPosition) Exit Function End If CurrentToken = CurrentToken + 1 CurrentPosition = ParseToPosition + 1 Loop Until (CurrentPosition >= Len(TempString)) End Function
<think>嗯,用户问的是如何在C语言中去除字符串中的重复字符。我需要先理解用户的需求,可能他们有一个包含重复字符的字符串,想要处理成一个每个字符只出现一的新字符串。比如,输入"aaabbbccc",输出"abc"。 首先,我得回忆C语言中处理字符串的基本方法。字符串在C中是字符数组,以'\0'结尾。处理这类问题通常需要遍历字符串,检查每个字符是否已经存在,如果不存在就保留,否则跳过。不过,如何高效地实现呢? 可能的思路是使用一个辅助数组或者哈希表来记录已经出现的字符。但C语言中没有内置的哈希表,可能需要自己实现一个简单的数组来记录ASCII字符的出现情况,因为ASCII有256个字符,可以用一个大小为256的数组来标记是否出现过。 然后,遍历原字符串的每个字符,对于每个字符,检查对应的标记数组。如果没出现过,就添加到结果字符串中,并标记为已出现。如果已经出现过,就跳过。这样时间复杂度是O(n),空间复杂度是O(1)(因为数组大小固定)。 不过需要考虑字符串是可变的,所以需要原地修改还是创建新字符串。用户提供的例子中,引用的trim函数是原地修改的,可能用户倾向于原地处理。但去除重复字符可能需要创建新字符串,因为删除中间的字符会影响后续字符的位置,原地处理可能比较复杂。或者可以逐个覆盖前面的位置,最后添加'\0'。 例如,原字符串是char数组,可以用两个指针:一个读指针,一个写指针。读指针遍历每个字符,写指针只在遇到未重复的字符时写入,并更新标记数组。最后在写指针的位置添加'\0'。 这样,代码的大致步骤是: 1. 初始化一个标记数组,所有元素为0。 2. 初始化读指针和写指针都指向字符串开头。 3. 遍历每个字符: a. 如果当前字符的标记为0,说明未出现过,将其复制到写指针的位置,写指针后移,标记为1。 b. 如果当前字符的标记为1,跳过。 4. 遍历结束后,在写指针的位置添加'\0'。 但这样处理的话,原字符串会被修改,且结果是从前往后覆盖的。例如,字符串"abba",处理后的结果会是"ab",然后后面的字符会被截断。这应该是可行的。 但需要考虑字符的大小写是否敏感,比如'A'和'a'是否算重复。假设用户需要区分大小写,按原样处理。 现在,编写代码示例。例如: #include <stdio.h> #include <string.h> void remove_duplicates(char *str) { if (str == NULL) return; int len = strlen(str); if (len <= 1) return; unsigned char seen[256] = {0}; int write_pos = 0; for (int read_pos = 0; read_pos < len; read_pos++) { unsigned char c = str[read_pos]; if (!seen[c]) { seen[c] = 1; str[write_pos++] = c; } } str[write_pos] = '\0'; } 测试一下这个函数,输入"hello",处理后应该是"helo"吗?是的。原字符串会被修改为"helo\0"。 不过这个方法的缺点是改变了原字符串的顺序,只保留每个字符第一出现的位置。比如"abac"会变成"abc",而后续的重复字符会被跳过。这可能符合用户的需求。 但用户可能希望保留所有字符的某种顺序,比如保留最后一出现的字符?不过通常去重是指保留首出现的,所以这个逻辑应该是正确的。 另外,需要考虑字符串是否包含'\0'以外的其他控制字符,但一般情况下去除的是可见字符的重复,所以用ASCII数组是足够的。 然后,编写示例代码,并解释每一步的作用。比如,初始化seen数组,遍历每个字符,检查是否已存在,然后覆盖写入,最后添加终止符。 可能用户提供的引用中有关于去除首尾空格的代码,可以类比,但这里的处理方式不同。需要确保代码正确,比如使用unsigned char来避免符号扩展的问题,如引用2中使用isspace时强制转换为unsigned char。 所以,在seen数组中,索引是字符的ASCII值,用unsigned char转换避免负值。 可能还需要处理空指针的情况,比如函数开始时检查str是否为NULL,避免崩溃。 然后,相关问题可能涉及如何保留最后一出现的重复字符,或者如何优化空间使用,或者如何处理宽字符等。</think>### C语言去除字符串重复字符的方法 在C语言中去除字符串重复字符,可通过**标记法**实现。核心思路是使用辅助数组记录字符出现情况,通过双指针法原地修改字符串。以下是实现步骤: 1. **初始化辅助数组**:创建一个大小为256的数组(对应ASCII字符集),用于标记字符是否已出现。 2. **双指针遍历**: - 读指针(`read_pos`)遍历原字符串 - 写指针(`write_pos`)仅在遇到未重复字符时写入 3. **覆盖重复字符**:将不重复的字符依覆盖到字符串前部,最后添加终止符`\0`。 ```c #include <stdio.h> #include <string.h> void remove_duplicates(char *str) { if (str == NULL) return; int len = strlen(str); if (len <= 1) return; unsigned char seen[256] = {0}; // 标记字符是否已出现[^2] int write_pos = 0; for (int read_pos = 0; read_pos < len; read_pos++) { unsigned char c = str[read_pos]; if (!seen[c]) { seen[c] = 1; // 标记为已出现 str[write_pos++] = c; // 写入不重复字符 } } str[write_pos] = '\0'; // 终止字符串 } // 示例调用 int main() { char s[] = "hello world!"; remove_duplicates(s); printf("去重后: %s\n", s); // 输出: helo wrd! return 0; } ``` #### 关键点说明 - **时间复杂度**:$O(n)$,仅需一遍历 - **空间复杂度**:$O(1)$,固定大小的辅助数组 - **原地修改**:直接操作原字符串,无需额外内存分配[^3] - **大小写敏感**:区分大小写(例如`'A'`和`'a'`视为不同字符) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值