36.假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:将字符串中的前导*号全部移到字符串的尾部。

36.假定输入的字符串中只包含字母和号。请编写函数fun,它的功能是:将字符串中的前导号全部移到字符串的尾部。
例如,字符串中的内容为*******A*BC*DEF*G****,移动后,字符串中的内容应当是A*BC*DEF*G***********。在编写函数时,不得使用C语言提供的字符串函数。

效果

在这里插入图片描述

代码

#include <stdio.h>
char *fun(char *s){
   
	//统计前导有多少个*
	int n=
  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 可以使用双指针的方法,一个指针指向字符串的开头,另一个指针指向字符串的结尾。从开头开始遍历字符串,如果遇到*,则将指针向后移动一位;如果遇到字母,则将该字母与结尾指针所指的字符交换位置,并将结尾指针向前移动一位。直到开头指针和结尾指针相遇为止,即可完成前导*移到字符串尾部的操作。 以下是示例代码: ```python def fun(s): s = list(s) i, j = , len(s) - 1 while i < j: if s[i] == '*': i += 1 else: s[i], s[j] = s[j], s[i] j -= 1 return ''.join(s) ``` 例如,对于输入字符串s = "***abc*def**ghi*", 调用fun(s)的结果为:"abcdefghi***"。 ### 回答2: 要实现这个功能,我们可以使用双指针方法。假设用i来表示字符串的读指针(即遍历字符串时的当前位置),j来表示写指针(即前导*移到的位置)。 首先,我们需要找到第一个不是*的位置,并将其设为读指针的起始位置i。这可以用一个while循环来实现。在循环,只要当前位置是*,就将读指针i向后移动一位。 接下来,我们用一个for循环遍历读指针i和写指针j之间的所有位置。如果当前位置是*,就把它写到写指针j的位置,并将j向后移动一位;否则,不做任何处理。 循环结束后,我们再用一个for循环把剩下的*写到字符串尾部即可。写指针此时指向的位置就是字符串第一个非*的位置,我们可以用字符串切片的方式把它之后的部分移到字符串尾部。 下面是完整的函数代码: ```python def fun(s): # 找到第一个非*的位置 i = 0 while i < len(s) and s[i] == '*': i += 1 # 双指针移动 j = i for i in range(i, len(s)): if s[i] == '*': s[j] = s[i] j += 1 # 将剩余的*移动到字符串尾部 s = s[:j] + '*' * (len(s) - j) return s ``` 时间复杂度:O(n),其n为字符串的长度。空间复杂度:O(n),需要额外开辟一个与原字符串长度相同的字符串来存储结果。 ### 回答3: 这道题目要求我们编写一个函数,将输入字符串前导的"*"全部移到字符串尾部,即将第一个不是"*"的字符之前的"*"全部移动到字符串的末尾。 我们可以从字符串的开头开始遍历,找到第一个不是"*"的字符,然后将其前面的所有"*"往后移。具体的算法如下所示: 1.定义一个空字符串result,用于保存移动后的字符串。 2.定义一个变量starCount,用于记录当前字符之前的"*"的数量。 3.从字符串的开头开始遍历,对于每一个字符,如果当前字符是"*",则将starCount加1;如果当前字符不是"*",则将当前字符和starCount个"*"依次添加到result字符串。 4.遍历完整个字符串后,如果原字符串以"*"结尾,则将starCount个"*"添加到result字符串。 5.返回结果字符串result。 下面是Python代码实现: ```python def fun(s): result = '' starCount = 0 for c in s: if c == '*': starCount += 1 else: result += '*' * starCount + c starCount = 0 result += '*' * starCount return result ``` 测试代码如下: ```python print(fun("***abc")) # "abc***" print(fun("****")) # "****" print(fun("abc")) # "abc" print(fun("*abc")) # "abc*" ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Inspiration666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值