首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

华为的一道面试题 要求现场写出答案 关于字符串处理和排序解决方法

2012-04-03 
华为的一道面试题 要求现场写出答案 关于字符串处理和排序任意一串字符串 字符串里包含数字部分和一般的字

华为的一道面试题 要求现场写出答案 关于字符串处理和排序
任意一串字符串 字符串里包含数字部分和一般的字符

例如 ad2ef35adx1wewe76
注意这个字符串 里面有4个数字 分别是 1 2 35 76 不考虑大数

将数字按照从小到大排序 组成一个新的字符串

要求制作一个函数来进行处理

假设是 fun(char*src,char*des)
  {
  }

src 输入字符串 ad2ef35adx1wewe76
des 输出字符串 1-2-35-76

[解决办法]
一个一个读,如果小于9的向后读,直到大于9,然后存储在一个容器里面,直到字符串读完
然后对元素排序输出
[解决办法]
src 输入字符串 ad2ef35adx1wewe76
des 输出字符串 1-2-35-76

第一步,建立一个缓冲,删除所有的字母
留下 2-35-1-76 这个应该没什么难度的.
再一步 使用 strtok ,
如果可以使用容器就比较简单,往容器里塞,然后容器排序
,如果不能使用容器,都要自己造轮子,哪就麻烦一点了

[解决办法]

C/C++ code
#include <stdlib.h>#include <stdio.h>#include <string.h>#include <ctype.h>#define TOKEN '-'//return 0 succeeds,-1 errorint func(const char *src,char *dest){    if(src==NULL || dest==NULL)    {        return -1;    }    bool lastIsNum=false;    bool isFirstNum=true;    while(*src!=0)    {        if(isdigit(*src))        {            if(!lastIsNum)    //前一个非数字            {                if(!isFirstNum)    //非第一个数字                {                    *dest++=TOKEN;                }                else    //第一个数字                {                    isFirstNum=false;                }                    }            *dest++=*src;    //拷贝数字            lastIsNum=true;        }        else        {            lastIsNum=false;        }        ++src;    }    *dest=0;    return 0;}int main(){    char output[100];    func("ad2ef35adx1wewe76",output);    fprintf(stdout,"%s\n",output);    return 0;}
[解决办法]
额,要求数字从大到小排序啊,我改一改.
[解决办法]
用一个链表存数字,然后每个字母每个字母的读,记录上一个数字出现的位置,遇到一连串的数字就提出了进行类型类型的转换,然后用插入排序法插入链表。
[解决办法]
C/C++ code
#include <stdlib.h>#include <stdio.h>#include <string.h>#include <ctype.h>#define TOKEN '-'int compare(const void *left,const void *right){    const int *l=(const int *)left;    const int *r=(const int *)right;    if(*l<*r)    {        return -1;    }    else if(*l>*r)    {        return 1;    }    else    {        return 0;    }}//return 0 succeeds,-1 errorint func(const char *src,char *dest){    if(src==NULL || dest==NULL)    {        return -1;    }    bool lastIsNum=false;    //数数有几个num    const char *scan=src;    int count=0;    while(*scan!=0)    {        if(isdigit(*scan))        {            if(!lastIsNum)            {                ++count;            }            lastIsNum=true;        }        else        {            lastIsNum=false;        }        ++scan;    }    int *arr=(int*)malloc(sizeof(int)*count);    if(arr==NULL)    {        return -1;    }    lastIsNum=false;    char *num=dest;    const char *end=src+strlen(src);    count=0;    while(src<=end)    {        if(isdigit(*src))        {            *num++=*src;            lastIsNum=true;        }        else        {            if(lastIsNum)            {                *num=0;                arr[count++]=atoi(dest);                num=dest;            }            lastIsNum=false;        }        ++src;    }    qsort(arr,count,sizeof(int),compare);    bool isFirstNum=true;    for(int i=0;i<count;++i)    {        if(isFirstNum)        {            isFirstNum=false;        }        else        {            *dest++='-';        }        itoa(arr[i],dest,10);        dest+=strlen(dest);    }    return 0;}int main(){    char output[100];    func("ad2ef35adx1wewe76",output);    fprintf(stdout,"%s\n",output);    return 0;} 


[解决办法]
忘记free了,自己加上= =.
[解决办法]

C/C++ code
#include <stdlib.h>#include <stdio.h>#include <string.h>#include <ctype.h>#define TOKEN '-'char *Extraction_sequence(char*src, char*des);int main(){    char output[100];    Extraction_sequence("ad2ef35adx1wewe76", output);    fprintf(stdout, "%s\n", output);    return 0;}char *Extraction_sequence(char*src, char*des){    char * ret = des; // 返回指针    char * buf = new char[strlen(src) + 1];  // 缓冲buf    char * c_buf = buf;    while (*src) {                      // 提取字符串中的数字        if (isdigit(*src)) {            *c_buf++ = *src;            if (!isdigit(*(src + 1))) // 数字后面添加 分割标记                *c_buf++ = TOKEN ;        }        src++;    }    *c_buf = '\0'; // 封闭字符串/*     现在还没想好怎么写      6 楼的排序代码也可以,不过我还没仔细看懂          */    strcpy(des , buf); // 保存结果    delete[] buf;    return ret;}
[解决办法]
我也写一个。。共同学习。。
C/C++ code
#include <iostream>#include <list>#include <string>#include <algorithm>using namespace std;void fun(const char *str, char *des){    list<int> li;    bool isGet = false;    int get = 0;    while (*str != 0)    {        if (*str < 58 && *str >= 48)        {            get = get * 10 + *str - '0';            isGet = true; //遇到数字开始截取。        }        else        {            if (isGet == true)            {                isGet = false;                //cout << get << endl;                li.push_back(get);                get = 0;            }        }        str++;    }    if (isGet == true) //字符串以数字结束    {        li.push_back(get);    }    if (li.size() != 0)    {        li.sort();        string temp;        for (list<int>::iterator it = li.begin(); it != li.end(); it++)        {            char array[100];            itoa(*it, array, 10); // mark            temp += array;            temp += '-';                    }        string final_str = temp.substr(0,temp.size()-1); //mark        strcpy(des, final_str.c_str());    }    else    {        strcpy(des, "no digital!");    }}int main(){    char aa[100], bb[100];    cout << "input a string" << endl;    cin >> aa;    fun(aa, bb);    cout << bb << endl;        return 0;}
[解决办法]
C/C++ code
#include <iostream>    // 数据流输入/输出#include <string>      // 字符串类#include <algorithm>   // STL 通用算法#include <vector>      // STL 动态数组容器#include <stdlib.h>#include <stdio.h>#include <string.h>#include <ctype.h>#define TOKEN '-'using namespace std;bool strsize(const string& i, const string& j);char* Extraction_sequence(const char* src, char* des);int main(){    char output[100];    Extraction_sequence("ad2ef35adx1wewe76", output);    printf("%s\n", output);    return 0;}bool strsize(const string& i, const string& j){ return (i.size() < j.size()); }char* Extraction_sequence(const char* src, char* des){    char* ret = des;  // 返回指针    char* buf = new char[strlen(src) + 1];   // 缓冲buf    char* c_buf = buf;    // 提取字符串中的数字    while (*src) {        if (isdigit(*src)) {            *c_buf++ = *src;            if (!isdigit(*(src + 1))) // 数字后面添加 分割标记                *c_buf++ = TOKEN ;        }        src++;    }    *(c_buf - 1) = '\0'; // 封闭字符串    /* 排序数字序列*/    vector <string> seq;    vector <string>::iterator iter;    char* pch;    pch = strtok(buf, "-");    while (pch != NULL) {        seq.push_back(pch);           //2 35 1 76   置入到容器里        pch = strtok(NULL, "-");    }    sort(seq.begin(), seq.end(), strsize); // 2 1 35 76   先按数字长度排列    sort(seq.begin(), seq.end());           // 1 2 35 76   再按字典排列    iter = seq.begin();    des[0] = '\0'; // des 清零    while (iter != seq.end()) {        strcat(des, (iter++)->c_str()) ;        strcat(des, "-") ;    }    des[strlen(des)-1] = '\0';  // des 消除最后的 标记'-'    delete[] buf;    return ret;} 


[解决办法]

C/C++ code
#include <iostream>    // 数据流输入/输出#include <string>      // 字符串类#include <algorithm>   // STL 通用算法#include <vector>      // STL 动态数组容器#include <stdlib.h>#include <stdio.h>#include <string.h>#include <ctype.h>#define TOKEN '-'using namespace std;bool strsize(const string& i, const string& j);char* Extraction_sequence(const char* src, char* des);int main(){    char output[100];    Extraction_sequence("ad2e99f35a0dx1we5465d修正465465w000e76", output);    printf("%s\n", output);    return 0;}bool strsize(const string& i, const string& j){    if (i.size() == j.size()) {        return (i < j);    }    return (i.size() < j.size());}char* Extraction_sequence(const char* src, char* des){    char* ret = des;  // 返回指针    char* buf = new char[strlen(src) + 1];   // 缓冲buf    char* c_buf = buf;    // 提取字符串中的数字    while (*src) {        if (isdigit(*src)) {            *c_buf++ = *src;            if (!isdigit(*(src + 1))) // 数字后面添加 分割标记                *c_buf++ = TOKEN ;        }        src++;    }    *(c_buf - 1) = '\0'; // 封闭字符串    /* 排序数字序列*/    vector <string> seq;    vector <string>::iterator iter;    char* pch;    pch = strtok(buf, "-");    while (pch != NULL) {        seq.push_back(pch);           //2 35 1 76   置入到容器里        pch = strtok(NULL, "-");    }    sort(seq.begin(), seq.end(), strsize); //按数字长度和大小排列    iter = seq.begin();    des[0] = '\0'; // des 清零    while (iter != seq.end()) {        strcat(des, (iter++)->c_str()) ;        strcat(des, "-") ;    }    des[strlen(des) - 1] = '\0'; // des 消除最后的 标记'-'    delete[] buf;    return ret;}
[解决办法]
这个题不难吧,先是找到一个数字然后按照大小插入到链表中。
[解决办法]
楼主你好。我想问下函数原型必须是你描述的那样吗?如果不是可以这样做(这题和前段时间校园招聘的题有类似之处):
#include <stdio.h>
void take_num(const char *strIn, int *n, unsigned int *outArray)
{
const char *p = strIn;
int count = 0; //统计个数和充当下标的作用
int value = 0; //储存临时的整数 
int i,j,temp; 
while(*p)
{
if('0' <= *p && *p <= '9')
{
while('0' <= *p && *p <= '9')
{
value = value * 10 + (*p - '0'); // 将字符串转换为数字
p++;
}
outArray[count] = value; //存储数字到数组中
value = 0;
count++; // 整数个数加1;下标加1
}
p++;
}
*n = count; 
for(j=0;j<count-1;j++)
{
for(i=0;i<count-j-1;i++)
{
if(outArray[i]>outArray[i+1])
{
temp=outArray[i];
outArray[i]=outArray[i+1];
outArray[i+1]=temp;
}
}

}
  
int main()
{
char *strIn="ad2ef35adx1wewe76";
int count;
unsigned int outArray[100];
take_num(strIn, &count, outArray);
printf("字符串提取出的数字个数:%d\n分别是:", count);
for(int j = 0; j < count-1; j++)
{
printf("%d-", outArray[j]);
}
printf("%d\n", outArray[count-1]);
  
return 0;

不懂得如何插入代码,请见谅。
[解决办法]
C/C++ code
#include <stdio.h>#include  <malloc.h>#include <string.h>#include <stddef.h>int fun(char*src,char*des);int main(void){    char des[20];    unsigned long num;    num=fun("0123d2ef35adx1w00e76",des);    printf("num=%lu\t%s\n",num,des);   return 0;}int fun(char*src,char*des)/*返回提取的数字个数*/{    unsigned long num =0,temp = 0;    size_t i;    unsigned long *array = (unsigned long *)malloc(sizeof(unsigned int)*strlen(src));    while(*src)        if('0'<= *src && *src <='9')        {            temp = *src++ - '0';            while('0'<= *src && *src <='9')                temp = 10 * temp+ *src++ - '0';            i = num++;            while(i != 0)/*找到应该插入的位置*/                if(array[i-1] > temp)                {                    array[i] =array[i-1];                    --i;                }                else                    break;            array[i] = temp;        }        else            ++src;    for(i=0; i != num; ++i)    {        if(i != 0)            *des++ = '-';        des += sprintf(des,"%lu",array[i]);    }    free(array);    return  num;} 


[解决办法]
请教下大家如何在回复中插入代码?有好心人帮帮忙吗?谢谢了
[解决办法]
[Quote=引用:]
请教下大家如何在回复中插入代码?有好心人帮帮忙吗?谢谢了

C/C++ code
[code=C/C++]/*这里是你要插入的代码*/
[解决办法]
[Quote=引用:]

[Quote=引用:]
请教下大家如何在回复中插入代码?有好心人帮帮忙吗?谢谢了
C/C++ code

C/C++ code
/*这里是你要插入的代码*/可是我在回复的时候没有看见有插入的选项啊。[code=C/C++]/*这里是你要插入的代码*/这段是怎么引用过来的?谢谢了
[解决办法]
写了一段,取数字的代码,没有考虑0的开头的因素。
C/C++ code
bool flag;int a[10];void fun(char*src,char*des){    int i=0;    while(*src)    {        if(*src=="1"&&*src=="2"&&*src=="3"&&*src=="4"&&*src=="5"&&*src=="6"&&*src=="7"&&*src=="8"&&*src=="9"&&*src=="0")        {            flag=true;            a[i]=(int)*src;            src++;            while(*src=="1"&&*src=="2"&&*src=="3"&&*src=="4"&&*src=="5"&&*src=="6"&&*src=="7"&&*src=="8"&&*src=="9"&&*src=="0")            {                          a[i]=a[i]*10+(int)*src;              src++;            }            i++;        }        }}
[解决办法]
探讨
[Quote=引用:]

[Quote=引用:]
请教下大家如何在回复中插入代码?有好心人帮帮忙吗?谢谢了
C/C++ code


C/C++ code

/*这里是你要插入的代码*/
可是我在回复的时候没有看见有插入的选项啊。
[code=C/C++]
/*这里是你要插入的代码*/
这段是怎么引用……

[解决办法]
探讨

[Quote=引用:]
请教下大家如何在回复中插入代码?有好心人帮帮忙吗?谢谢了

热点排行