华为的一道面试题 要求现场写出答案 关于字符串处理和排序
任意一串字符串 字符串里包含数字部分和一般的字符
例如 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 ,
如果可以使用容器就比较简单,往容器里塞,然后容器排序
,如果不能使用容器,都要自己造轮子,哪就麻烦一点了
[解决办法]
#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;}
[解决办法]
额,要求数字从大到小排序啊,我改一改.
[解决办法]
用一个链表存数字,然后每个字母每个字母的读,记录上一个数字出现的位置,遇到一连串的数字就提出了进行类型类型的转换,然后用插入排序法插入链表。
[解决办法]
#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了,自己加上= =.
[解决办法]
#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;}
[解决办法]
我也写一个。。共同学习。。
#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;}
[解决办法]
#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;}
[解决办法]
#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;
}
不懂得如何插入代码,请见谅。
[解决办法]
#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=引用:]
请教下大家如何在回复中插入代码?有好心人帮帮忙吗?谢谢了
[code=C/C++]/*这里是你要插入的代码*/
[解决办法]
[Quote=引用:]
[Quote=引用:]
请教下大家如何在回复中插入代码?有好心人帮帮忙吗?谢谢了
C/C++ code
/*这里是你要插入的代码*/可是我在回复的时候没有看见有插入的选项啊。[code=C/C++]/*这里是你要插入的代码*/这段是怎么引用过来的?谢谢了
[解决办法]
写了一段,取数字的代码,没有考虑0的开头的因素。
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++; } }}
[解决办法]