華爲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;
	}
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章