您的位置:首页 > 其它

华为软件训练营培训前自测题(黑色为网上看到版本,蓝色为自己写的,红色为修改后的版本)

2012-05-04 18:15 260 查看
题目概述

输入一个长度为N(字符串长度不定)的字符串,字符均为英文字符

请完成如下功能:

1)根据输入的字符串,产生n个字符子串

字符子串生成规则:分隔符是空格,字符子串的排列顺序与原始字符串保持一致,且不包含分隔符

2)根据要求输出某个序号的字符子串,序号1~n表示。

示例:

输入的原始字符串为“ Welcome to HuaWei software training camp! ”

要求输出的第1个字符子串,则输出结果应为“Welcome”

要求输出的第2个字符子串,则输出结果应为“to”

要求输出的第6个字符子串,则输出结果应为“camp!”

请实现如下接口:

接口1:InputString

Description : 输入原始字符串

Prototype : void InputString(char* pInString);

Input Param : pInString 原始字符串。pInString指向的字符串存储空间在函数外会被释放,请自行申请存储空间

接口2: FindSubString

Description : 输出排序后指定的某个字符串

Prototype : void FindSubString(int SerialNumber, char** ppOutString)

Input Param : SerialNumber:从1~n为字符子串序号

Output Param : *ppOutString 指针指向字符子串的首地址,字符串必须以’\0’结束。

如果SerialNumber非法,将*ppOutString指向空字符串。

接口3: Clear

Description : 清除字符子串序列的存储空间

Prototype : void Clear(void)
网上转来的一篇简短小程序:

#include <iostream>

#include <memory>

#include "string"

#include <vector>

using namespace std;

static int num = 0;

static char** strArray = NULL;

void SetSubStringNum(char* pInString)

{

while(pInString)

{

if(*pInString == ' ' || *pInString == '\0')//此处有个bug。。如果有连续的空格则会多计数目。

num++;

if(*pInString == '\0')

return;

pInString++;

}

}

//

/***

void SetSubStringNum(char* pInString)

{

char last_get_char=' ';

while(pInString)

{

if(*pInString
== ' ' || *pInString == '\0')//这样改就可以了

{

if(last_get_char=='
')

continue;

else

num++;

}

if(*pInString
== '\0')

return;

last_get_char=*pInString;

pInString++;

}

}

**/

//这个函数写的很好//

void SetStringArray(char* pInString)

{

strArray = new char*[num];

int subIndex = 0, subLen = 0;

while(pInString)

{

subLen++;

if(*pInString == ' ' || *pInString == '\0')

{

strArray[subIndex] = new char[subLen];

memcpy(strArray[subIndex], pInString - subLen + 1, subLen);

strArray[subIndex][subLen] = '\0';

subIndex++;

subLen = 0;

}

if(*pInString == '\0')

return;

pInString++;

}

}

void InputString(char* pInString)

{

SetSubStringNum(pInString);

SetStringArray(pInString);

}

//注意ppOutString的处理方式和它与实参的联系

void FindSubString(int SerialNumber, char** ppOutString)

{

if(SerialNumber >= 1 && SerialNumber <= num)

*ppOutString = strArray[SerialNumber - 1];

else

*ppOutString = NULL;

}

void Clear()

{

for(int i = 0; i < num; i++)

delete[] strArray[i];

delete[] strArray;

}

int main(){

InputString("Welcome to HuaWei software training camp!");

char* OutString;

//注意第二个参数

FindSubString(3, &OutString);

cout << OutString << endl;

char c;

cin >> c;

return 0;

}

自己的程序稍后上传

/*******************************************************************************

File Name : main.cpp

Version : 1.0

Author : Eric

Created : 2012/5

Last Modified :

Description :

1) 根据输入的字符串,产生n个字符子串

字符子串生成规则:

分隔符是空格,字符子串的排列顺序与原始字符串保持一致,且不包含分隔符

2)根据要求输出某个序号的字符子串,序号1~n表示。

Function List :

//计算字符子串数目,转化为字符串,

void SumStringMakeList(char* pInString);

//字符链表转化为字符串

void CharList2ArrString(char* pInString);

//接口1 输入字符串

void InputString(char* pInString);

//接口2 查找字符串

void FindSubString(int SerialNumber, char** ppOutString);

//接口3 释放空间

void Clear(void);

History :

1.Date : 2012/5

Author : Eric

Modification: Created file

******************************************************************************/

#include <iostream>

#include <string>

#include "stdlib.h"

using namespace std;

//*********字符链表*********

typedef struct charnode

{

char data;

struct charnode* next;

}charnode,*pCharLinkList;

pCharLinkList head_char_list;

//静态全局变量 字符子串头指针

static char** OutStrings;

//静态全局变量 字符子串的字符数

static int* CharOfString;

//静态全局变量 字符子串数量

static int NumOfString=0;

char* testlist={" this is a testline of this program hahahahahahahahahahhahahhahahahahahahahah "};

//计算字符子串数量,转化为字符串,

void SumStringMakeList(char* pInString);

//字符链表转化为字符串

void CharList2ArrString(char* pInString);

//接口1

void InputString(char* pInString);

//接口2

void FindSubString(int SerialNumber, char** ppOutString);

//接口3

void Clear(void);

//帮助函数

void Help(void);

int main()

{

int SerialNumber=0;

char * outputstring;

Help();

cout<<testlist<<endl;

InputString(testlist);

cout <<endl<< "the testline have "<< NumOfString<<" strings"<<endl;

for(SerialNumber=1;SerialNumber<=NumOfString;SerialNumber++)

{

FindSubString( SerialNumber,&outputstring);

cout<<outputstring<<endl;

}

Clear();

return 0;

}

void Help(void)

{

cout << "this program is a program of pre-test of huawei software training camp"

"you can modify the testline if you want \n"

"the output is output the strings in the testline in order \n"

"Copyright (C), 2012-2013,Eric Huawei Tech. Co., Ltd.\n"

"\n"

"\n" ;

}

void InputString(char* pInString)

{

SumStringMakeList(pInString);

CharList2ArrString(pInString);

}

void SumStringMakeList(char* pInString)

{

char inputed_char;

char last_inputed_char=' ';

charnode *s, *r=NULL;

head_char_list=(charnode * )malloc(sizeof(charnode));

head_char_list->data='0';

head_char_list->next=NULL;

while(pInString)

{

//构建字符链表

inputed_char=*pInString;

if(inputed_char==' '||inputed_char=='\0')

{

if(inputed_char=='\0')

{

if(last_inputed_char!=' ')//让链表的最后都改存成'\0'

{

NumOfString++;

s=(charnode*)malloc(sizeof(charnode));

s->data=' ';

s->next=NULL;

if(head_char_list->next==NULL)

{

s->next=head_char_list->next;

head_char_list->next=s;

}

else r->next=s;

r=s;//当前尾节点

}

return;

}

if(inputed_char==' ')

{

if(last_inputed_char==' ')//如果是分隔符

{//上个字符为分隔符则不保存 不计数

pInString++;

continue;

}

else

{

NumOfString++;

}

}

}

s=(charnode*)malloc(sizeof(charnode));

s->data=inputed_char;

s->next=NULL;

if(head_char_list->next==NULL)

{

s->next=head_char_list->next;

head_char_list->next=s;

}

else r->next=s;

cout<<s->data;//测试链表用

r=s;//当前尾节点

last_inputed_char=inputed_char;

pInString++;

}

}

void CharList2ArrString(char* pInString)

{

char inputed_char;

int indexofstring=0,indexofchar=0;

int NumOfCharOfNowString=0;

char last_inputed_char=' ';

CharOfString = new int[NumOfString];

OutStrings = new char*[NumOfString];

//先遍历得知每个string的长度

while(pInString)

{//构建字符链表

inputed_char=*pInString;

if(inputed_char==' '||inputed_char=='\0')

{

if(inputed_char=='\0')

{//如果是结尾符,不计数保存上个string的char数

CharOfString[indexofstring]=NumOfCharOfNowString;

break;

}

if(last_inputed_char==' ')//如果是分隔符

{//上个字符为分隔符,则不保存不计数入

pInString++;

continue;

}

else

{

CharOfString[indexofstring]=NumOfCharOfNowString;

NumOfCharOfNowString=0;//归零

indexofstring++;//自增

}

}

//不是结尾符 不是分隔符计数

if(inputed_char!=' ')

NumOfCharOfNowString++;//

last_inputed_char=inputed_char;

pInString++;

}

for(int i=0;i<NumOfString;i++)

{

cout<<CharOfString[i]<<' ';

}

cout<<endl;

for(indexofstring=0;indexofstring<NumOfString;indexofstring++)

{

OutStrings[indexofstring] = new char[CharOfString[indexofstring]];

}

indexofstring=0;

indexofchar=0;

//链表递出 赋值销毁

while(head_char_list->next)

{

indexofchar++;

if(head_char_list->next->data==' ')

{

OutStrings[indexofstring][indexofchar-1]='\0';

indexofstring++;

indexofchar=0;

}

else

{

OutStrings[indexofstring][indexofchar-1]=head_char_list->next->data;

}

//此处还应加链表释放

charnode* p=head_char_list->next;

free(head_char_list);

head_char_list=p;

}

delete[]CharOfString;

}

void Clear()

{

for(int i = 1; i < NumOfString; i++)

delete [] OutStrings[i];//不知为何此处用 delete[]OutStrings[i];报错

delete[] OutStrings;

return;

}

void FindSubString(int SerialNumber, char** ppOutString)

{

if(SerialNumber >= 1 && SerialNumber <= NumOfString)

*ppOutString = OutStrings[SerialNumber - 1];

else

*ppOutString = NULL;

}

//空间释放的时候有问题,时而通过时而通不过。。。。 delete 用的有问题 写入越界!

改正后的 通过的

/******************************************************************************

Copyright (C), 2001-2011, Huawei Tech. Co., Ltd.

******************************************************************************

File Name : FindSubString.cpp

Version :

Author :

Created : 2012/5

Last Modified :

Description :

Function List :

History :

1.Date : 2012/5

Author : Eric

Modification: Created file

******************************************************************************/

#include <iostream>

#include <string.h>

#include "stdlib.h"

using namespace std;

//*********字符链表*********

typedef struct charnode

{

char data;

struct charnode* next;

}charnode,*pCharLinkList;

pCharLinkList head_char_list;

//静态全局变量 字符子串头指针

static char** OutStrings;

//静态全局变量 字符子串的字符数

static int* CharOfString;

//静态全局变量 字符子串数量

static int NumOfString=0;

//计算字符子串数量,转化为字符串,

void SumStringMakeList(char* pInString);

//字符链表转化为字符串

void CharList2ArrString(char* pInString);

//接口1

void InputString(char* pInString);

//接口2

void FindSubString(int SerialNumber, char** ppOutString);

//接口3

void Clear(void);

//帮助函数

/******************************************************************************************************

Description : 输入原始字符串

Prototype : void InputString(char* pInString);

Input Param : pInString 原始字符串。pInString指向的字符串存储空间在函数外会被释放,请自行申请存储空间

Output Param : 无

Return Value : 无

********************************************************************************************************/

void InputString(char* pInString)

{

/* 在这里实现功能 */

SumStringMakeList(pInString);

CharList2ArrString(pInString);

return;

}

void SumStringMakeList(char* pInString)

{

char inputed_char;

char last_inputed_char=' ';

charnode *s, *r=NULL;

head_char_list=(charnode * )malloc(sizeof(charnode));

head_char_list->data='0';

head_char_list->next=NULL;

while(pInString)

{

//构建字符链表

inputed_char=*pInString;

if(inputed_char==' '||inputed_char=='\0')

{

if(inputed_char=='\0')

{

if(last_inputed_char!=' ')//让链表的最后都改存成'\0'

{

NumOfString++;

s=(charnode*)malloc(sizeof(charnode));

s->data=' ';

s->next=NULL;

if(head_char_list->next==NULL)

{

s->next=head_char_list->next;

head_char_list->next=s;

}

else r->next=s;

r=s;//当前尾节点

}

return;

}

if(inputed_char==' ')

{

if(last_inputed_char==' ')//如果是分隔符

{//上个字符为分隔符则不保存 不计数

pInString++;

continue;

}

else

{

NumOfString++;

}

}

}

s=(charnode*)malloc(sizeof(charnode));

s->data=inputed_char;

s->next=NULL;

if(head_char_list->next==NULL)

{

s->next=head_char_list->next;

head_char_list->next=s;

}

else r->next=s;

r=s;//当前尾节点

last_inputed_char=inputed_char;

pInString++;

}

}

void CharList2ArrString(char* pInString)

{

char inputed_char;

int indexofstring=0,indexofchar=0;

int NumOfCharOfNowString=0;

char last_inputed_char=' ';

CharOfString = new int[NumOfString];

OutStrings = new char*[NumOfString];

//先遍历得知每个string的长度

while(pInString)

{//构建字符链表

inputed_char=*pInString;

if(inputed_char==' '||inputed_char=='\0')

{

if(inputed_char=='\0')

{//如果是结尾符,不计数保存上个string的char数

if(last_inputed_char!=' ')

CharOfString[indexofstring]=NumOfCharOfNowString;

break;

}

if(last_inputed_char==' ')//如果是分隔符

{//上个字符为分隔符,则不保存不计数入

pInString++;

continue;

}

else

{

CharOfString[indexofstring]=NumOfCharOfNowString;

NumOfCharOfNowString=0;//归零

indexofstring++;//自增

}

}

//不是结尾符 不是分隔符计数

if(inputed_char!=' ')

NumOfCharOfNowString++;//

last_inputed_char=inputed_char;

pInString++;

}

for(indexofstring=0;indexofstring<NumOfString;indexofstring++)

{

OutStrings[indexofstring] = new char[CharOfString[indexofstring]+1];

}

delete[]CharOfString;

indexofstring=0;

indexofchar=0;

//链表递出 赋值销毁

while(head_char_list->next)

{

indexofchar++;

if(head_char_list->next->data==' ')

{

OutStrings[indexofstring][indexofchar-1]='\0';

indexofstring++;

indexofchar=0;

}

else

{

OutStrings[indexofstring][indexofchar-1]=head_char_list->next->data;

}

//此处还应加链表释放

charnode* p=head_char_list->next;

free(head_char_list);

head_char_list=p;

}

}

/*****************************************************************************

Description : 输出排序后指定的某个字符串

Prototype : void FindSubString(int SerialNumber, char** ppOutString)

Input Param : SerialNumber 排序后的序列号,从1~N为按照字典从小到大的排列顺序

Output Param : *ppOutString 指针指向字符子串的首地址,字符串必须以’\0’结束。

如果SerialNumber非法,将*ppOutString指向空字符串。

Return Value : 无

*****************************************************************************/

void FindSubString(int SerialNumber, char** ppOutString)

{

/* 在这里实现功能 */

if(SerialNumber >= 1 && SerialNumber <= NumOfString)

*ppOutString = OutStrings[SerialNumber - 1];

else

*ppOutString = "";

return;

}

/*****************************************************************************

Description : 清除字符串序列的存储空间

Prototype : void Clear(void)

Input Param : 无

Output Param : 无

Return Value : 无

*****************************************************************************/

void Clear(void)

{

/* 在这里实现功能 */

for(int i = 0; i < NumOfString; i++)

delete [] OutStrings[i];//不知为何此处用 delete[]OutStrings[i];报错

delete[] OutStrings;

return;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐