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

时间:2021-02-01 18:52:10
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;
}
}