华为2012校园招聘上机编程题(2)

1、删除字符串中所有给定的子串
问题描述: 
在给定字符串中查找所有特定子串并删除,如果没有找到相应子串,则不作任何操作。
要求实现函数: 
 int delete_sub_str(const char *str, const char *sub_str, char *result_str)
【输入】 str:输入的被操作字符串
               sub_str:需要查找并删除的特定子字符串
【输出】 result_str:在str字符串中删除所有sub_str子字符串后的结果

【返回】 删除的子字符串的个数

int delete_sub_str(const char *str, const char *sub_str, char *result_str)
{
	/*
	//----------------------------第一种方法------------------------------
	const char *p1 = str;
	const char *p2 = sub_str;
	char *p3 = result_str;
	int count = 0;
	while(*p1 != '\0')
	{
	const char *ptemp;
	if(*p1 != *p2)
	{
	*p3 = *p1;
	p3++;
	}
	else
	{
	ptemp = p1;
	while(*p1 == *p2)
	{
	p1++;
	p2++;
	}

	if(*p2 == '\0' && *p1 != '\0')
	{
	count++;
	p1--;
	p2 = sub_str;
	}
	else if((*(--p1) == '\0') && (*(--p2) == '\0'))
	{
	count++;
	break;
	}
	else
	{
	p1 = ptemp;
	*p3++ = *p1;
	p2 = sub_str;
	}
	}
	p1++;
	}
	*p3 = '\0';
	return count;
	*/

	//--------------------------第二种方法-------------------------------------------
	size_t str_len = strlen(str);
	size_t sub_len = strlen(sub_str);

	const char *pos = strstr(str,sub_str);

	int count = 0;
	size_t i = 0, k = 0;

	while(pos != NULL)
	{
		count ++;

		while(&str[i] != pos)
		{
			result_str[k++] = str[i++];
		}
		i = i + sub_len;

		pos = strstr(pos + sub_len,sub_str);
	}

	if(pos == NULL)
	{
		while(i < str_len)
			result_str[k++] = str[i++];
	}
	result_str[k] = '\0';

	return count;

}

2、约瑟夫问题

问题描述:
输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知),和初始计数值m。从数列首位置开始计数,计数到m后,将数列该位置数值替换计数值m,并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止。如果计数到达数列尾段,则返回数列首位置继续计数。请编程实现上述计数过程,同时输出数值出列的顺序

 比如:输入的随机数列为:3,1,2,4,初始计数值m=7,从数列首位置开始计数(数值3所在位置) 
第一轮计数出列数字为2,计数值更新m=2,出列后数列为3,1,4,从数值4所在位置从新开始计数 
第二轮计数出列数字为3,计数值更新m=3,出列后数列为1,4,从数值1所在位置开始计数
 第三轮计数出列数字为1,计数值更新m=1,出列后数列为4,从数值4所在位置开始计数
 最后一轮计数出列数字为4,计数过程完成。
 输出数值出列顺序为:2,3,1,4。

要求实现函数:
 void array_iterate(int len, int input_array[], int m, int output_array[])
【输入】  int len:输入数列的长度;
 int intput_array[]:输入的初始数列
 int m:初始计数值
【输出】  int output_array[]:输出的数值出列顺序
【返回】  无
示例
输入:int input_array[] = {3,1,2,4},int len = 4, m=7
输出:output_array[] = {2,3,1,4}

void array_iterate(int len, int input_array[], int m, int output_array[])
{
	struct node
	{
		int data;
		node *next;
	};

	node *head = new node;
	head->data = input_array[0];
	head->next = NULL;

	node *pmove = head;
	int i = 1;
	while(i < len)
	{
		node *ptemp = new node;
		ptemp->data = input_array[i];
		ptemp->next = NULL;
		pmove->next = ptemp;
		pmove = pmove->next;
		i++;
	}
	pmove->next = head;

	int k = 0;
	node *prenode;
	while(k != len)
	{
		while(m > 0)
		{
			prenode = pmove;
			pmove = pmove->next;
			m--;
		}	
		output_array[k++] = pmove->data;
		m = pmove->data;
		prenode->next = pmove->next;
		delete pmove;
		pmove = prenode;
	}
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值