- 浏览: 24878 次
最新评论
第一节、字符串查找
1.1题目描述:
给定一个字符串A,要求在A中查找一个子串B。
如A="ABCDF",要你在A中查找子串B="CD"。
分析:比较简单,相当于实现strstr库函数,主体代码如下:
//在字符串中查找指定字符串的第一次出现,不能找到则返回-1
int strstr(char *string, char *substring)
{
if (string == NULL || substring == NULL)
return -1;
int lenstr = strlen(string);
int lensub = strlen(substring);
if (lenstr 字符串中查找第一个子串的功能,时间复杂度为O(n*m),也可以用KMP算法,复杂度为O(m+n)。具体的,在此不再赘述。
希望此狂想曲系列能给各位带来的是一种方法,一种创造力,一种举一反三的能力,而不是机械的只是为大家提供答案。那样的话,一切永远都只是邯郸学步,你我都无从进步(而这同时却是许多所谓的面经或面试宝典之类的书很乐意做的事,有点不解)。
为人打通思路,提高他人创造力,我想,这是狂想曲与其它的面试解答所不同的地方,也是我们写狂想曲系列文章的意义与价值之所在。
1.2、题目描述
在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。
代码则可以如下编写:
//查找第一个只出现一次的字符,
char FirstNotRepeatChar(char* pString)
{
if(!pString)
return'\0';
constint tableSize = 256;
//有点要提醒各位注意,一般常数的空间消耗,如这里的256,我们也认为此空间复杂度为O(1)。
int hashTable[tableSize] = {0}; //存入数组,并初始化为0
char* pHashKey = pString;
while(*(pHashKey) != '\0')
hashTable[*(pHashKey++)]++;
while(*pString != '\0')
{
if(hashTable[*pString] == 1)
return *pString;
pString++;
}
return'\0'; //没有找到满足条件的字符,退出 } 代码二,bitmap:
# include
# include
constint N = 26;
int bit_map[N];
void findNoRepeat(char *src)
{
int pos;
char *str = src;
int i ,len = strlen(src);
//统计
for(i = 0 ; i 字符串开始遍历其bit_map==1 那么就是结果
for(i = 0 ; i 字符串拷贝
题目描述:
要求实现库函数strcpy,
原型声明:externchar *strcpy(char *dest,char *src);
功能:把src所指由NULL结束的字符串复制到dest所指的数组中。
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。
分析:如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案:
//得2分
void strcpy( char *strDest, char *strSrc )
{
while( (*strDest++ = * strSrc++) != '\0' );
}
//得4分
void strcpy( char *strDest, constchar *strSrc )
{
//将源字符串加const,表明其为输入参数,加2分
while( (*strDest++ = * strSrc++) != '\0' );
}
//得7分 void strcpy(char *strDest, constchar *strSrc) { //对源地址和目的地址加非0断言,加3分
assert( (strDest != NULL) && (strSrc != NULL) );
while( (*strDest++ = * strSrc++) != '\0' );
}
//得9分
//为了实现链式操作,将目的地址返回,加2分!
char * strcpy( char *strDest, constchar *strSrc )
{
assert( (strDest != NULL) && (strSrc != NULL) );
char *address = strDest;
while( (*strDest++ = * strSrc++) != '\0' );
return address;
}
//得10分,基本上所有的情况,都考虑到了
//如果有考虑到源目所指区域有重叠的情况,加1分!
char * strcpy( char *strDest, constchar *strSrc )
{
if(strDest == strSrc) { return strDest; }
assert( (strDest != NULL) && (strSrc != NULL) );
char *address = strDest;
while( (*strDest++ = * strSrc++) != '\0' );
return address;
}
第三节、小部分库函数的实现
考察此类编写同库函数一样功能的函数经常见于大大小小的IT公司的面试题目中,以下是常见的字符串库函数的实现,希望,对你有所帮助,有任何问题,欢迎不吝指正:
//@yansha:字串末尾要加结束符'\0',不然输出错位结果
char *strncpy(char *strDes, constchar *strSrc, unsigned int count)
{
assert(strDes != NULL && strSrc != NULL);
char *address = strDes;
while (count-- && *strSrc != '\0')
*strDes++ = *strSrc++;
*strDes = '\0';
return address;
}
//查找字符串s中首次出现字符c的位置
char *strchr(constchar *str, int c)
{
assert(str != NULL);
for (; *str != (char)c; ++ str)
if (*str == '\0')
return NULL;
return str;
}
int strcmp(constchar *s, constchar *t)
{
assert(s != NULL && t != NULL);
while (*s && *t && *s == *t)
{
++ s;
++ t;
}
return (*s - *t);
} char *strcat(char *strDes, constchar *strSrc) { assert((strDes != NULL) && (strSrc != NULL)); char *address = strDes; while (*strDes != '\0') ++ strDes; while ((*strDes ++ = *strSrc ++) != '\0') NULL; return address; } int strlen(constchar *str) { assert(str != NULL); int len = 0; while (*str ++ != '\0') ++ len; return len; } //此函数,梦修改如下
char *strdup_(char *strSrc)
//将字符串拷贝到新的位置
{
if(strSrc!=NULL)
{
char *start=strSrc;
int len=0;
while(*strSrc++!='\0')
len++;
char *address=(char *)malloc(len+1);
assert(address != NULL);
while((*address++=*start++)!='\0');
return address-(len+1);
}
return NULL;
}
//多谢laoyi19861011指正
char *strstr(constchar *strSrc, constchar *str)
{
assert(strSrc != NULL && str != NULL);
constchar *s = strSrc;
constchar *t = str;
for (; *strSrc != '\0'; ++ strSrc)
{
for (s = strSrc, t = str; *t != '\0' && *s == *t; ++s, ++t)
NULL;
if (*t == '\0')
return (char *) strSrc;
}
return NULL;
}
char *strncpy(char *strDes, constchar *strSrc, unsigned int count)
{
assert(strDes != NULL && strSrc != NULL);
char *address = strDes;
while (count -- && *strSrc != '\0')
*strDes ++ = *strSrc ++;
*strDes = '\0';
return address;
}
char *strncat(char *strDes, constchar *strSrc, unsigned int count)
{
assert((strDes != NULL) && (strSrc != NULL));
char *address = strDes;
while (*strDes != '\0')
++ strDes;
while (count -- && *strSrc != '\0' )
*strDes ++ = *strSrc ++;
*strDes = '\0';
return address;
}
int strncmp(constchar *s, constchar *t, unsigned int count)
{ assert((s != NULL) && (t != NULL)); while (*s && *t && *s == *t && count --) { ++ s; ++ t; } return (*s - *t); } char *strpbrk(constchar *strSrc, constchar *str) { assert((strSrc != NULL) && (str != NULL)); constchar *s; while (*strSrc != '\0') { s = str; while (*s != '\0') { if (*strSrc == *s) return (char *) strSrc; ++ s; } ++ strSrc; } return NULL; } int strcspn(constchar *strSrc, constchar *str) { assert((strSrc != NULL) && (str != NULL)); constchar *s; constchar *t = strSrc; while (*t != '\0') { s = str; while (*s != '\0') { if (*t == *s) return t - strSrc; ++ s; } ++ t; } return 0; } int strspn(constchar *strSrc, constchar *str) { assert((strSrc != NULL) && (str != NULL)); constchar *s; constchar *t = strSrc; while (*t != '\0') { s = str; while (*s != '\0') { if (*t == *s) break; ++ s; } if (*s == '\0') return t - strSrc; ++ t; } return 0; } char *strrchr(constchar *str, int c) { assert(str != NULL); constchar *s = str; while (*s != '\0') ++ s; for (-- s; *s != (char) c; -- s) if (s == str) return NULL; return (char *) s; } char* strrev(char *str) { assert(str != NULL); char *s = str, *t = str, c; while (*t != '\0') ++ t; for (-- t; s = 'a' && *s = 'A' && *s psrc && pdest - psrc 0 ) ret = 1 ; return( ret ); } size_t __cdecl strlen (constchar * str) { constchar *eos = str; while( *eos++ ) ; return( (int)(eos - str - 1) ); } char * __cdecl strncat (char * front,constchar * back,size_t count) { char *start = front; while (*front++) ; front--; while (count--) if (!(*front++ = *back++)) return(start); *front = '\0'; return(start); } int __cdecl strncmp (constchar * first,constchar * last,size_t count) { if (!count) return(0); while (--count && *first && *first == *last) { first++; last++; } return( *(unsigned char *)first - *(unsigned char *)last ); } /* Copy SRC to DEST. */ char * strcpy (dest, src) char *dest; constchar *src; { reg_char c; char *__unbounded s = (char *__unbounded) CHECK_BOUNDS_LOW (src); const ptrdiff_t off = CHECK_BOUNDS_LOW (dest) - s - 1; size_t n; do { c = *s++; s[off] = c; } while (c != '\0'); n = s - src; (void) CHECK_BOUNDS_HIGH (src + n); (void) CHECK_BOUNDS_HIGH (dest + n); return dest; } char * __cdecl strncpy (char * dest,constchar * source,size_t count) { char *start = dest; while (count && (*dest++ = *source++)) /* copy string */ count--; if (count) /* pad out with zeroes */ while (--count) *dest++ = '\0'; return(start); }
发表评论
-
笔记-正则表达式的2种引擎
2012-07-06 09:44 699正则表达式的引擎分为2种,一种是DFA引擎,一种是NFA引 ... -
常用正则表达式手册
2012-07-06 09:36 600匹配中文字符的正则表达式: [u4e00-u9fa5] ... -
网页换皮肤
2012-07-06 09:29 524... -
后台向前台js传递参数
2012-07-05 20:44 726aspx页面代码 //图片预览效果 function S ... -
基于组件中间件的前端架构
2012-07-03 13:42 739在现在的软件设计上,基本上采用的都是分布式系统,前端尤其突 ... -
基于组件中间件的前端架构
2012-07-03 12:15 597在现在的软件设计上,基本上采用的都是分布式系统,前端尤其突 ... -
Flex做的颜色器
2012-07-02 10:10 462此效果用对象的toString()方法来格式化输出字符串类 ... -
flex LineChart 的demo
2012-07-02 10:10 516... -
flex图片截取保存本地
2012-07-02 10:10 595Alert{font-size:12px;} ... -
Flex中,跨List实现SHIFT多选的例子
2012-07-02 10:10 641最近工作中遇到的问题,客户要求做这么个东西。还是稍微 ... -
FLEX 条形图(柱状图)设置刻度为百分比
2012-07-01 09:29 1073作者原创,如需转载请注明出处:www.krzone.org ... -
谈谈我对未来的想法吧
2012-07-01 09:28 761来总行珠海研发中 ... -
JavaFX Script With Eclipse 入门
2012-07-01 09:28 519最近Java社区最火的就是JavaFX Script的发布 ... -
Linux网络入侵检测软件
2012-07-01 09:28 691本软件是本人的毕业设计"作品"。当年是 ... -
Spring 3.0 整合 iBatis 3 Beta10 配置
2012-07-01 09:28 577弄了好长时间了,上网找各种资料,文档,最后发现Spring ... -
Flex Javascript交互实现代码
2012-06-30 11:13 541Flex Javascript交互实现代码 2010年09月 ... -
我参与的《云计算》项目前台Flex架构
2012-06-30 11:13 509我参与的《云计算》项 ... -
Flex 组成、变量、函数、命名空间
2012-06-30 11:13 577Flex 组成、变量、函数、命名空间 2011年04月13日 ... -
[引用]Ant 在Flex中的应用
2012-06-30 11:13 570[引用]Ant 在Flex中的应用 2011年08月13日 ... -
oracle之物理数据库结构概述(数据文件、重做日志文件,控制文件等各种数据库文件)
2012-01-20 02:25 507oracle之物理数据库结构 ...
相关推荐
被爱可以字符串处理工具由中国被爱可以在线站长Bicyle开发,是一款字符串处理的绿色工具软件,它具有繁简体转换 、URL和HTML编码转换、字母大小写转换、邮件地址分组、半全角转换、区位码和ASCII码查询,WAP文档UTF-...
自己封装的纯C++的字符串处理函数大全,像特别好用的 字符串切分 Split函数代码均已经过测试,并有接口说明,可方便调用。
字符串处理通用程序 功能说明: ①:查找 ②:删除 ③:替换 ④:插入 寄存器说明: SI:①:主串下标 ②:替换串下标 DX:保存主串下标SI AL:保存主串字符 BX:子串下标 AH:保存子串字符 DI:存储下标 标记...
被爱可以字符串处理工具由中国被爱可以在线站长Bicyle开发,是一款字符串处理的绿色工具软件,它具有繁简体转换 、URL和HTML编码转换、字母大小写转换、邮件地址分组、半全角转换、区位码和ASCII码查询,WAP文档UTF...
java 常用字符串处理工具类! java 常用字符串处理工具类!
汇编字符串处理
C语言学习-字符串处理函数 strcat(char str1,char str2) strcpy(char str1,char str2) strncpy(char str1,char str2,int n) strcmp(char str1,char str2)//比较两个字符串大小str1>str2返回值>0,str1=str2...
字符串处理函数及示例 如: 函数名: strcpy 功 能: 拷贝一个字符串到另一个 用 法: char *strcpy(char *destin, char *source); 程序例: C/C++ code #include #include int main(void) { char string[10]; char ...
acm习题,字符串处理 ,必做题解析,题目经典,含有解析
多重字符处理机制,仿照python字符串处理写的一个针对c++的字符串处理
mysql常用字符串函数、字符串处理函数大全。word文档内容中涵盖了mysql数据库字符串处理的38个函数。可完全满足日常对mysql数据库的字符处理操作。
本文档中包含了基础的字符串处理函数strlen(),strcat(),strlwr(),struupr(),等等一些基础的函数,非常有利于初学编程的人进行学习,对字符串进行更深入的了解!同时,内部应用的指针的典型用法,巩固对指针的理解!...
几个字符串处理函数增强版 常用需求基本都能完成 已经编译成DLL 函数列表 兼容字符和串 void revstr char str 字符串反转 int substring char res int pos int len char substr 从pos开始取len个字符到substr中 ...
JAVA字符串处理函数列表一览 JAVA字符串相关
Python内置的字符串处理函Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。自从20世纪90年代初Python语言诞生至今,它逐渐被广泛应用于处理系统管理任务和Web编程。
被爱可以字符串处理工具及 被爱可以字符串处理工具注册机
该资源是一个鲁棒性好,经过优化的C++字符串处理算法,包括分割字符串,自定义分隔符,字符串匹配,字符串搜索,不需要编译和安装。
VB字符串处理函数大全:mid(字符串,从第几个开始,长度) ByRef 在[字符串]中[从第几个开始]取出[长度个字符串]
字符串处理系统课程设计
编写一个applet程序,在窗口界面中实现当输入一个字符串和一个字符后,原字符串中所有该字符将被删除并显示出结果