字符串高频面_七月算法出品讲义.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
字符串高频面试题精讲 七月算法 曹鹏 2015年4月21日 */17 提纲 字符串简介 面试题总体分析 一些例题 例1 0-1串交换排序 例2 字符的替换和复制 例3 交换星号 例4 子串变位词 例5 单词(字符串)翻转 总结 字符串简介 字符串(String) 通常把它作为字符数组 java : String内置类型,不可更改,要更改的话可考虑转StringBuffer, StringBuilder, char []之类 C++ : std::string可更改,也可以考虑用char[] (char*) C: 只有char[] 注意 C++中“+”运算符,复杂度未定义,但通常认为是线性的 C++ std::string substr和java的String的subString参数不同 字符范围: C/C++ [-128..+127], 我们通常转化为unsigned 变为[0..+255] Java: [0..65535] */17 面试题总体分析 和数组相关,内容广泛 概念理解:字典序 简单操作:插入、删除字符,旋转 规则判断 (罗马数字转换 是否是合法的整数、浮点数) 数字运算( 大数加法、二进制加法) 排序、交换 (partition过程) 字符计数(hash):变位词 匹配 (正则表达式、全串匹配、KMP、周期判断) 动态规划 (LCS、编辑距离、最长回文子串) 搜索 (单词变换、排列组合) */17 例1 0-1交换 把一个0-1串(只包含0和1的串)进行排序,你可以交换任意两个位置,问最少交换的次数?(国内某公司最新在线笔试题) 分析: 快排partition?最左边的那些0和最右边的那些1都可以不管 00…0001…….0111….1 int answer = 0; for (int i = 0, j = len – 1; i j; ++i, --j) { for (;(i j) (a[i] == ‘0’);++i); for (;(j i) (a[j] == ‘1’); --j); if (i j) ++answer; } */17 例2 字符替换和复制 删除一个字符串所有的a,并且复制所有的b。注:字符数组足够大 分析: 先删除a,可以利用原来字符串的空间 int n = 0, numb = 0; for (int i = 0; s[i]; ++i) { if (s[i] != ‘a’) { s[n++] = s[i];} if (s[i] == ‘b’) { ++numb;} } s[n] = 0; 再复制b,注意字符串要加长 先计算字符串里有几个b,得到复制后的长度 然后“倒着”复制——惯用技巧 */17 例2——续 int newLength = n + numb; s[newLength] = 0; for (int i = newLength - 1, j = n – 1; j =0; --j) { s[i--] = s[j]; if (s[j] == ‘b’) s[i--] = ‘b’; } 思考题: 如何把字符串的空格变成”%20”?同样,字符数组足够大! */17 例3 交换星号 例3 一个字符串只包含*和数字,请把它的*号都放开头。 方法1 快排partition——数字相对顺序会变化 循环不变式: [0..i – 1]都是*, [i..j – 1]是数字,[j..n – 1]未探测 for (int i = 0, j = 0; j n; ++j) if (s[j] == ‘*’) swap(s[i++], s[j]); */17 例3 续1 样例 *01*2*4 i=0, j = 0, *01*2*4 交换s[0],不变,i = 1 i=1, j = 1, *01*2*4 不变 i = 1, j = 2, *01*2*4 不变 i=1, j = 3, 交换s[1],s[3]变为 **102*4 并且i = 2 i=2, j = 4,**102*4不变 i = 2, j = 5, 交换s[2],s[5]变为***0214 且i = 3 再往后没变化了 */17 例3 续2 方法2 数字相对顺序不变 “倒着” int j = n – 1; for (int i = n – 1; i = 0; --i) if (isdigit(s[i])) s[j--] = s[i]; for (; j = 0; --j) s[j] = ‘*’; */17 例4 子串变位词 给定两个串a和b,问b是否

文档评论(0)

w447750 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档