在记事本中写算法题和在纸上写其实感觉差不多,反正是不能进行调试。想起某高手的话,写代码要做到“人机合一”,写高级语言时(指的是 C 和 C++)脑海中要知道当前写的代码对应的反汇编代码,也就是要深入了解编译器对高级语言的处理。什么时候能达到这样的境界呢?

LeetCode 题库的第 20 题——有效的括号

  我做题的习惯跟考试的习惯差不多,先找会做的,然后再慢慢啃不会的。本着一个原则,不用编译器,不去找答案,不会说明基础不牢固,继续补基础。

  题目我截图过来。

  上面的图是题目和给出的示例,示例是用来补充题目的,看着示例就知道什么时候应该返回 true ,什么时候返回 false 了。

解题思路

  LeetCode 都会给出每个题的函数定义,比如这个题的定义如下:

 bool isValid(char* s) {
}

  我选择的是 C 语言来答题。

  这个题中告诉我们:

  1、正确的括号包括 括弧、方括号 和 花括号;

  2、括号需要 成对 出现;

  3、函数传递过来的是字符串。

  那么,我的思路是:

  1、获得字符串的长度,用来 申请一块 堆空间 和 遍历括号;

  2、申请一块同样大小的 堆内存空间 做数组,用来模拟 堆栈 数据结构;

  3、用一个变量来记录栈顶的位置,其实就是数组当前的下标;

  4、然后遍历括号,如果是 ( [ { ,那么就进入 堆栈,并修改栈顶的位置;

  5、如果是 ) ] } 那么就去和当前数组位置的前一个值进行比较,如果能够闭合,那么就让前一个出栈,并且修改栈顶的位置;

  6、如果无法闭合,那么就返回假;

  7、循环完成后,如果 堆栈 为空,说明括号都可以闭合,就返回 1,C 语言中 非0 为真;

  8、如果 堆栈 不为空,说明有尚未闭合的括号,就返回0, C 语言中 0 为假。

解题答案

  这个题就是 数据结构 中堆栈的应用,还是比较简单的。完整代码如下:

 bool isValid(char* s) {
int len = strlen(s);
int i;
int pos = ; char *pArr = (char*)malloc(len * sizeof(char)); for ( i = ; i < len; i ++ ) {
if (s[i] == '(' || s[i] == '[' || s[i] == '{') {
pArr[pos ++] = s[i];
}
if (s[i] == ')') {
if ( pArr[pos - ] != '(' ) {
return ;
} else {
pos--;
}
} else if (s[i] == '}') {
if ( pArr[pos - ] != '{' ) {
return ;
} else {
pos--;
}
} else if (s[i] == ']') {
if ( pArr[pos - ] != '[' ) {
return ;
} else {
pos--;
}
}
} if ( pos != ) {
return ;
} return ;
}

  代码写的好不好就不管了,很多题都是 主调函数 释放空间,所以答题时,没有将 堆空间 释放掉,同样的 申请堆空间后,也没有判断内存是否申请成功。有很多地方写的不严谨,以后改正。


我的微信公众号:“码农UP2U”

最新文章

  1. 弱占优策略--Weakly Dominant Strategy
  2. AngularJS开发指南2:AngularJS初始化过程
  3. Mac 下 命令收藏
  4. scan &amp; ATPG
  5. xml基础学习笔记03
  6. Python时间,日期,时间戳之间转换
  7. Binary search for the first element greater than target
  8. Go语言探险思考笔记
  9. PHP:urlencode
  10. Centos7解决图形界面卡死问题
  11. centos通过yum安装mysql
  12. Redis(REmote DIctionary Server)基础
  13. qtp 自动化测试桌面程序-点滴1(录制设置、共用文件)
  14. Alpha 冲刺11——总结
  15. HTML前序
  16. Send or receive files via Xshell
  17. 流行的FPGA的上电复位
  18. gluoncv,faster rcnn 处理难样本
  19. tp between
  20. Java线程状态切换以及核心方法

热门文章

  1. 在 .NET Core 下使用 SixLabors.ImageSharp 操作图片文件(放大、缩小、裁剪、加水印等等)的几个小示例
  2. linux的ls命令详解
  3. python基础(4):用户交互、if判断、while循环、break和continue
  4. Python绘图还在用Matplotlib?out了 !发现一款手绘可视化神器!
  5. C#中巧用Lambda表达式实现对象list进行截取
  6. css精灵图&amp;字体图标
  7. ES6数组及对象遍历的新增方法 entries(),keys() 和 values()
  8. leaflet-webpack 入门开发系列二加载不同在线地图切换显示(附源码下载)
  9. 文:你可以杀我,但你不能评价(judge)我
  10. python3+Scrapy爬虫使用pipeline数据保存到文本和数据库,数据少或者数据重复问题