《C++ Primer 第五版》书实在是太长,太厚了。总是看了十几页就看累了,坚持不了多久,想了想还是别勉强自己,决定把它当工具书查看,或者积累足够的C++经验后再翻阅一遍。

目前的打算是结合一本叫《Craking the coding interview》里的例子来学,选这个的原因是 fanfanK http://blog.csdn.net/fanfank?viewmode=contents 的推荐,同时这本书又有hawstein   http://hawstein.com/posts/ctci-solutions-contents.html 提供很好的解答环境,打算每天做3题。

10.8

作者:Hawstein
出处:http://hawstein.com/posts/1.1.html
声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处。


Q1.1:       http://hawstein.com/posts/1.1.html

实现一个算法来判断一个字符串中的字符是否唯一(即没有重复).不能使用额外的数据结构。 (即只使用基本的数据结构)

方法一采用了一个bool数组来记录是否出现过,方法的特点主要是结合Ascii码可以转换为数字,对应记录到数组中。

方法二把数组记录变为了一个长度为8的int 数组a,然后进行位运算,8*4*8=256,

看这个方法二的时候 顺便学习了下《C++ Primer 第五版》里的4.8 位运算符的部分。其中P137中写道:常见的错误是把位运算符和逻辑运算符搞混了。这也的确是我犯过的错误,比如位或| 和逻辑或|| 搞混过。

P126:“关系运算符作用于算数类型或指针类型,逻辑运算符作用于任意能转换成布尔值的类型。逻辑运算符和关系运算符的返回值都是布尔类型”

个人感想:用bool数组和位来记录一些0,1数据,的确很节省,顺便复习了下运算符。

Q1.2 http://hawstein.com/posts/1.2.html

写代码翻转一个C风格的字符串。(C风格的意思是"abcd"需要用5个字符来表示,包含末尾的 结束字符)

方法一用的是用两个指针去分别指头和尾,然后用逐个交换,其中的交换函数是这么写的:

void swap(char &a, char &b)
{a=a^b;b=a^b;a=a^b;
}

用的是引用传递,同时类似的交换方法有:

void swap(int &a, int &b)
{b=a-b;a=a-b;b=a+b;
}

这里会有一个小的bug,就是:如果swap这个函数里两个形参引用的是同一个变量,那么这两种方法都会出问题,存在这种情况的时候,还是用临时变量比较好。

这里顺便完成了Q19.1:写一个函数交换两个数,不能使用临时变量。 http://hawstein.com/posts/19.1html

方法二就是常规思路了,直接用int n=strlen(s) 来获取字符串长度,然后逐个交换即可。

个人感想:字符串用指针来处理,交换两个数时,可能存在bug。

Q1.3:

设计算法并写出代码移除字符串中重复的字符,不能使用额外的缓存空间。注意: 可以使用额外的一个或两个变量,但不允许额外再开一个数组拷贝。

方法一:就单纯遍历每个元素,访问一个就把字符串结尾的元素中相同的元素去掉(可以置0 或者 ‘\0'),时间复杂度为O(n*n)

void removeDuplicate(char s[])
{int len = strlen(s);if(len < 2) return;int p = 0;for(int i=0; i < len; ++i){if(s[i] != '\0'){s[p++] = s[i];for(int j=i+1; j < len; ++j)if(s[j]==s[i])s[j] = '\0';}}s[p] = '\0';
}

也有另外一种方法是O(kn)的,就是看0~tail之间有没有这个字符,没的话就s[tail++]=s[i],也就是把“处理过的数据”后面再加一个,如果有就跳过,最后做完之后,再加个结尾符号即可。

代码如下(具体分析可参考http://stackoverflow.com/questions/2598129/function-to-remove-duplicate-characters-in-a-string):

void remove(char *str)
{if (str == NULL) return;int len = strlen(str);if (len < 2) return;int tail = 1;for (int i = 1; i < len; ++i) {int j;for (j = 0; j < tail; ++j) {if (str[i] == str[j]) break;}if (j == tail) {str[tail++] = str[i]; }}str[tail] = 0;
}

渣基础:比照Hawstein学Cracking the coding interview(1)相关推荐

  1. 渣基础:比照Hawstein学Cracking the coding interview(3)

    作者:Hawstein 出处:http://hawstein.com/posts/1.4.html 声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Common ...

  2. 渣基础:比照Hawstein学Cracking the coding interview(4)

    作者:Hawstein 出处: http://hawstein.com/posts/2.1.html 声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commo ...

  3. 渣基础:比照Hawstein学Cracking the coding interview(2)

    作者:Hawstein 出处:http://hawstein.com/posts/1.4.html 声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Common ...

  4. Cracking the coding interview

    转自:http://hawstein.com/posts/ctci-solutions-contents.html Cracking the coding interview--问题与解答 March ...

  5. 经典算法题目:Cracking the coding interview 问题与解答

    Cracking the coding interview--问题与解答 March 14, 2013 作者:Hawstein 出处: http://hawstein.com/posts/ctci-s ...

  6. [Free] Cracking the Coding Interview 6th Download

    [Free] Cracking the Coding Interview 6th Download 推荐给有梯子的童鞋们! https://www.pdfdrive.com/cracking-the- ...

  7. [Cracking the Coding Interview] 4.4 Check Balanced

    Implement a function to check if a binary tree is balanced. For the purpose of this question, a bala ...

  8. 《Cracking the Coding Interview》——第18章:难题——题目11

    2014-04-29 04:30 题目:给定一个由'0'或者'1'构成的二维数组,找出一个四条边全部由'1'构成的正方形(矩形中间可以有'0'),使得矩形面积最大. 解法:用动态规划思想,记录二维数组 ...

  9. 《Cracking the Coding Interview》——第6章:智力题——题目5

    2014-03-20 01:08 题目:扔鸡蛋问题.有一个鸡蛋,如果从N楼扔下去恰好会摔碎,低于N楼则不碎,可以继续扔.给你两个这样的鸡蛋,要求你一定得求出N,怎么扔才能减少最坏情况下的扔的次数? 解 ...

最新文章

  1. 【开放书】《命令行数据科学指南(第二版)》
  2. 开源大数据周刊-第76期
  3. python蟒蛇绘制 C
  4. JsonData响应工具类封装
  5. 定义一个dto对象_业务代码的救星——Java 对象转换框架 MapStruct 妙用
  6. C++ 流的操作 | 初识IO类、文件流、string流的使用
  7. 优化理论14----二分法、二分法与黄金分割法比较、python实现
  8. matlab 误差修正模型,求问大神用R做VEC(误差修正)模型的程序包或者代码是什么啊?...
  9. java 解析dex_将DEX反编译成Java源代码
  10. 要闻君说:小米手机部组织架构突现大调整;河南联通重启VDC扩容工程招标;英特尔已收购Ineda Systems,剑指独显;...
  11. MacOS上禁用自动启动Adobe Creative Cloud
  12. 第一天:2个法则,你的第一桶金可以这么来
  13. 迷茫的剑客----网站设计师! -----静水流深
  14. 财务说账单上少了一分钱,老板看到代码气疯了
  15. 【大数据分析专业毕设之基于python的手机销售大数据分析可视化系统】
  16. vulnhub之hacksudo:Thor
  17. lpk.dll usp10.dll 感染病毒专杀工具 lpk usp10
  18. BGP路由策略与策略路由
  19. 《R语言数据挖掘:实用项目解析》——第2章,第2.8节假设检验
  20. 腾讯云短信服务——获取验证码

热门文章

  1. C语言习题:/*键盘输入两个非零整数A和B,如果A和B都是偶数则输出两个数的和,如果A和B都是奇数则输出两个数的差,如果A是奇数B是偶数则输出两数积,如果A是偶数B是奇数输出AVB结果*/
  2. 主播直播间抖音电商脚本运营话术模板表格方案管理计划
  3. 12x12怎么速算_如果孩子正读小学,学会这4个乘法速算技巧,将大大提高计算速度...
  4. 普通代码块和构造代码块
  5. 对TCG的概要分析和对TPM的学习-可信根说明以及RTM(二)
  6. 静音打印,UART驱动TMC2208教程
  7. 《资治通鉴》读书笔记及阅读感悟2200字
  8. 保姆级的Linux教学
  9. Ubuntu2004系统下佳能MG2400打印机无响应
  10. python之pyecharts画图