c语言处理字符串中的符号前移后移相关题目

#include <stdio.h>
#include <assert.h>
#include <stdarg.h>//可变参数编程
#include <string.h>
#include <stdlib.h>

/*
1.编码完成下面的处理函数,函数将字符串中的字符’‘移到字符串的前部分,前面的非’
字符后移,但不能改变非’‘字符的先后顺序,函数返回串中非’'字符的数量。(要求尽可能的占用少的时间和辅助空间)。
例如:原始串为autoch**ips,处理后为******autochips,函数返回9.
(1)请用文字或流程图简要描述您的思路;
(2)请用C语言编程实现,注意时间和空间开销。

2.将字符串中多个连续的空格删除,只保留一个空格.“a b cd e”->“a b cd e”
3.将字符串中的空格替换成"%20".例如"a bc d e"->“a%20bc%20d%20%20e”
*/

//第1题
int StarMove(char str)//O(n),O(1) 实现不太好,过于麻烦
{
char p;//指向最后一个
char q;//指向最后一个前的第一个非

int count = 0;
for(p=str;*p!=’\0’;p++)//找到尾巴
{
if(p != '’)
count++;
}

p--;//'\0'左边的位置
q = p;
char tmp;

while(p>= str && q >= str)
{
	while(p>=str && *p != '*')
	{
		p--;
	}
	q = p;
	while(q>=str && *q == '*')//找第一个非*
	{
		q--;
	}
	if(q<str || p<str)
	{
		break;
	}

	tmp = *p;
	*p = *q;
	*q = tmp;
}
return count;

}

//2.将字符串中多个连续的空格删除,只保留一个空格.“a b cd e”->“a b cd e”
void Fun1(char *str)//O(n),O(n)
{
char *tmp = (char *)malloc(strlen(str)+1);
int i = 0; //str下标
int j = 0;//tmp下标
while(str[i]!=’\0’)
{
if(str[i]!=’ ’ || str[i+1]!=’ ')//不是连续空格,拷贝
{
tmp[j++] = str[i];
}
//连续空格,不拷贝
i++;
}
tmp[j] = ‘\0’;

//将tmp的字符串拷贝到str中
strcpy(str,tmp);
free(tmp);

}

void Fun(char *str)//O(n),O(1)
{
int i = 0;//可以存放数据的下标
int j = 0;//当前下标
while(str[j] != ‘\0’)
{
if(str[j]!=’ ’ || str[j+1]!=’ ')//不是连续空格,复制
{
str[i++] = str[j];
}
j++;
}
str[i] = ‘\0’;
}

int main()
{
char str[] = “a b c d efg”;
char str1[] = “a b c d efg”;
Fun(str);
printf("%s\n%s\n",str,str1);
/char str[] = "autoch**ips";
int a = StarMove(str);
printf("%d,%s\n",a,str);*/

return 0;

}

#if 0
/*
可变参数编程:
1.第一个形参不能省,提供找…的位置线索

C语言:实际参数入栈是从右往左

*/

//求平均值
//int Avg(int a,int b)
//{
// return (a+b)/2;
//}
//
//int Avg(int a,int b,int c)
//{
// return (a+b+c)/3;
//}
//1~5个值的平均值
//int Avg(int n,int a,int b,int c,int d,int e)
//{
// assert(n != 0);
// int sum = 0;
// if(n == 1)
// sum = a;
// else if (n == 2)
// sum = a+b;
// else if(n==3)
// sum = a+b+c;
// else if(n == 4)
// sum = a+b+c+d;
// else if(n == 5)
// sum = a+b+c+d+e;
// return sum/n;
//}

int Avg(int n,…)
{
int sum = 0;
va_list list;
va_start(list,n);//将list定位到…的开头

for(int i=0;i<n;i++)//从...中取n个数字
{
	sum += va_arg(list,int);//从...取数据
}

va_end(list);//关闭指针

return sum/n;

}

int Max(int a,int b)
{
return a>b ? a : b;
}

int main()
{
//printf(“hehe\n”);
//printf("%d,%d\n",10,20);
printf("%d\n",Avg(1,10));
printf("%d\n",Avg(2,10,20));
printf("%d\n",Avg(3,10,20,30));
printf("%d\n",Avg(4,10,20,30,40));
printf("%d\n",Avg(5,10,20,30,40,50));

//Max(10,20);

//int arr[] = {1,2,3,4,5};
//int i = 2;                   // 4      3
//printf("%d,%d\n",arr[i++],arr[i++]);//4,3参数入栈从右往左  i++副作用


/*printf("%d\n",Avg(1,10,0,0,0,0));
printf("%d\n",Avg(2,10,20,0,0,0));
printf("%d\n",Avg(3,10,20,30,0,0));
printf("%d\n",Avg(4,10,20,30,40,0));
printf("%d\n",Avg(5,10,20,30,40,50));*/

return 0;

}
#endif

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值