随笔分类 -  沉溺3C (C/C++/C#)

所谓3C:C、 C++、 C#
心之所爱,沉溺其中,无以自拔
摘要:最长公共子串(Longest Common Substring)是一个非常经典的面试题目,在实际的程序中也有很高的实用价值,所以把该问题的解法总结在本文重。不过不单单只是写出该问题的基本解决代码而已,关键还是享受把学习算法一步步的优化,让时间和空间复杂度一步步的减少的惊喜。概览最长公共子串问题的基本表述为:给定两个字符串,求出它们之间最长的相同子字符串的长度。最直接的解法自然是找出两个字符串的所有子字符串进行比较看他们是否相同,然后取得相同最长的那个。对于一个长度为n的字符串,它有n(n+1)/2 个非空子串。所以假如两个字符串的长度同为n,通过比较各个子串其算法复杂度大致为O(n4)。这还没 阅读全文
posted @ 2013-07-18 10:27 Ider 阅读(73579) 评论(19) 推荐(10) 编辑
摘要:过去两个星期里,为了完成一个工作,接触到了NSObject中非常特别的两个类方法(Class Method)。它们的特别之处,在于iOS会在运行期提前并且自动调用这两个方法,而且很多对于类方法的规则(比如继承,类别(Category))都有不同的处理。而因为这两个方法是在程序运行一开始就被调用的方法,我们可以利用他们在类被使用前,做一些预处理工作。比如我碰到的就是让类自动将自身类名保存到一个NSDictionary中。先来看看NSObject Class Reference里对这两个方法说明:+(void)initializeThe runtime sends initialize to ea 阅读全文
posted @ 2012-09-29 12:35 Ider 阅读(43795) 评论(12) 推荐(10) 编辑
摘要:在《二分查找法的实现和应用汇总》中,我介绍了二分查找法的基本应用,不过在面试的准备过程中,我还碰到了更多对于二分查找法的更进一步的使用。其实在《二分查找法的实现和应用汇总》的最后,我已经介绍了一个非常规的使用,也就是基于“轮转后的有序数组(Rotated Sorted Array)”检查某一个数是否存在。找到轮转后的有序数组中第K小的数对于普通的有序数组来说,这个问题是非常简单的,因为数组中的第K-1个数(即A[K-1])就是所要找的数,时间复杂度是O(1)常量。但是对于轮转后的有序数组,在不知道轮转的偏移位置,我们就没有办法快速定位第K个数了。不过我们还是可以通过二分查找法,在log(n)的 阅读全文
posted @ 2012-09-08 09:45 Ider 阅读(5563) 评论(2) 推荐(1) 编辑
摘要:古语“画虎画皮难画骨”,是说画老虎时要画它的外表很容易,可要将老虎的气势画出来却很难。对于现在的程序员来说,似乎也是这样子,可以写出整洁的代码,设计出优异的程序,但却不一定需要知道代码在编译之后的是如何运行的。但是有时候,能了解表面背后的故事,知道一些程序编译过程,其实对写出一个正确的正确的程序会有很大的帮助,这起源自一段很简单的问题实现:两整数交换。简单的两数交换不简单最早学习到的实现方式,就是使用临时变量来保存一个数进行交换:int main(){ int a = 21; int b = 7; int tmp = a; a = b; b = tmp; ... 阅读全文
posted @ 2012-05-03 12:32 Ider 阅读(7416) 评论(27) 推荐(18) 编辑
摘要:在《C++的头文件和实现文件分别写什么》文章中,我对于的C++的数据成员,逐个分析了可以作用在它们上边的限定符都有哪些,以及它们所对应的进行初始化的位置。可以看出这些修饰符其实就是const和static的两种的组合,但是却有不同的效用。本文,我想讲关于static的问题,《C++的头文件和实现文件分别写什么》已经指出如果数据成员被声明为static,那么它在编译时就必须被初始化。仅含static的则放在类之外,实现文件之中;同时含有的const的则放在类之内,直接跟在数据的定义之后。在我实际代码编写中碰到的问题是:static成员的初始化比较的复杂,步骤较多,需要调用另一个函数来完成。此时, 阅读全文
posted @ 2012-04-10 11:28 Ider 阅读(7110) 评论(2) 推荐(2) 编辑
摘要:在学习算法的过程中,我们除了要了解某个算法的基本原理、实现方式,更重要的一个环节是利用big-O理论来分析算法的复杂度。在时间复杂度和空间复杂度之间,我们又会更注重时间复杂度。时间复杂度按优劣排差不多集中在:O(1), O(log n), O(n), O(n log n), O(n2), O(nk), O(2n)到目前位置,似乎我学到的算法中,时间复杂度是O(log n),好像就数二分查找法,其他的诸如排序算法都是 O(n log n)或者O(n2)。但是也正是因为有二分的 O(log n), 才让很多 O(n2)缩减到只要O(n log n)。关于二分查找法二分查找法主要是解决在“一堆数中找 阅读全文
posted @ 2012-04-01 12:26 Ider 阅读(64255) 评论(12) 推荐(18) 编辑
摘要:现在做程序的时候,开发人员都会偏向使用高级语言,例如Java,C#,PHP,一个很重要的原因就是开发效率高,开发速度快。而之所以这些高级语言能让写代码的速度变得那么快,一个重要原因就是伴随着这些高级语言的强大的接口类库。很多工作都简化成只要引用几个类库,调用几个方法就可以了。不过太过简单了,有时也未必是好事,比如给数组排序只要 .Sort()就得出结果了,也不用管用冒泡排序,还是用了快速排序,或者因为不能全部加载而用了归并排序。可是真说回来,谁在意呢。使用标准库,调用标准接口,大家都能看懂,而且经过多年的累积代码也更安全,效率自然也是更优的。但是若真不在意,有时候也会让程序变得难以阅读,代码变 阅读全文
posted @ 2012-03-15 03:45 Ider 阅读(4707) 评论(11) 推荐(5) 编辑
摘要:最近在学习Linux基础知识,从鸟哥的的Linux私房菜里学到了不少的东西。在学习Shell Script一章的时候,发现鸟哥用了这样的一个语法 test -e /dmtsai && echo "exist" || echo "Not exist" 鸟哥解释是为检测并标示/dmtsai文件夹是否存在用的。一开始我,我想可能是&&和||在Linux的Shell Script里面有不同的含义吧,可能这样的语法相当于C语言中的条件运算符( : ? )。但是怎么想都觉得&&和||在任何程序语言中都应该是逻辑运算符才 阅读全文
posted @ 2011-09-28 11:34 Ider 阅读(4421) 评论(11) 推荐(1) 编辑
摘要:索引目录传统转换方式及用户自定义转换const_castreinterpret_caststatic_castdynamic_cast再谈为何会有那四个转换运算符看起来,我应该把导师讲过、遗漏的有关C++类型转换方面的内容都总结成文了,主要内容都在以上几篇文章中阐述完毕。上边的每一篇文章,虽然都单独着重强调一种转换方式或运算符,但是也有提到跟其他运算符之间的差异性,以及使用建议,因此基本可以看出各个运算符的使用方式和作用。在文章也看到const_cast, reinterpret_cast, static_cast都可以用传统的转换方式基于指针进行替代。如果结合typeid运算符,那么dyna 阅读全文
posted @ 2011-08-05 23:48 Ider 阅读(8314) 评论(1) 推荐(0) 编辑
摘要:dynamic_cast <new_type> (expression)dynamic_cast运算符,应该算是四个里面最特殊的一个,因为它涉及到编译器的属性设置,而且牵扯到的面向对象的多态性跟程序运行时的状态也有关系,所以不能完全的使用传统的转换方式来替代。但是也因此它是最常用,最不可缺少的一个运算符。与static_cast一样,dynamic_cast的转换也需要目标类型和源对象有一定的关系:继承关系。 更准确的说,dynamic_cast是用来检查两者是否有继承关系。因此该运算符实际上只接受基于类对象的指针和引用的类转换。从这个方面来看,似乎dynamic_cast又和re 阅读全文
posted @ 2011-08-01 01:35 Ider 阅读(46156) 评论(11) 推荐(13) 编辑
摘要:static_cast <new_type> (expression)虽然const_cast是用来去除变量的const限定,但是static_cast却不是用来去除变量的static引用。其实这是很容易理解的,static决定的是一个变量的作用域和生命周期,比如:在一个文件中将变量定义为static,则说明这个变量只能在本Package中使用;在方法中定义一个static变量,该变量在程序开始存在直到程序结束;类中定义一个static成员,该成员随类的第一个对象出现时出现,并且可以被该类的所有对象所使用。对static限定的改变必然会造成范围性的影响,而const限定的只是变量或 阅读全文
posted @ 2011-07-31 02:16 Ider 阅读(92684) 评论(6) 推荐(6) 编辑
摘要:reinterpret_cast <new_type> (expression)reinterpret_cast运算符是用来处理无关类型之间的转换;它会产生一个新的值,这个值会有与原始参数(expressoin)有完全相同的比特位。什么是无关类型?我没有弄清楚,没有找到好的文档来说明类型之间到底都有些什么关系(除了类的继承以外)。后半句倒是看出了reinterpret_cast的字面意思:重新解释(类型的比特位)。我们真的可以随意将一个类型值的比特位交给另一个类型作为它的值吗?其实不然。IBM的C++指南里倒是明确告诉了我们reinterpret_cast可以,或者说应该在什么地方 阅读全文
posted @ 2011-07-30 13:58 Ider 阅读(151554) 评论(6) 推荐(20) 编辑
摘要:点击此处进行全屏查看Layout 文件CSS 文件Javascript 文件©2011 Copyright Ider Zheng 阅读全文
posted @ 2011-07-23 03:14 Ider 阅读(2882) 评论(3) 推荐(0) 编辑
摘要:前面讲了C++继承并扩展C语言的传统类型转换方式,最后留下了一些关于指针和引用上的转换问题,没有做详细地讲述。C++相比于C是一门面向对象的语言,面向对象最大的特点之一就是具有“多态性(Polymorphism)”。要想很好的使用多态性,就免不了要使用指针和引用,也免不了会碰到转换的问题,所以在这一篇,就把导师讲的以及在网上反复查阅了解的知识总结一下。C++提供了四个转换运算符:const_cast <new_type> (expression)static_cast <new_type> (expression)reinterpret_cast <new_typ 阅读全文
posted @ 2011-07-22 11:14 Ider 阅读(129265) 评论(23) 推荐(31) 编辑
摘要:在计算机语言中,类型的存在让我们可以更有针对性的进行数据和功能的处理,但是却又存在了类型转化的问题。C++如同其他计算机语言一样,也同样都这些问题。不过它相对于C而言多了引用类型(Reference);相对与C#来讲,又多了指针类型(Point)。这似乎让它的类型转化变得更加扑朔迷离。也许是C方面知识的延续,我对C++的基础类型之间的转换还算比较清楚的,但是由于C#的Convert这个类库是那么的好用,以至于我一直不太适应C++的转换方式。不过经过导师的教授,发现C++的也可以构建禇类似Convert的转换方式。在导师经过一堂课关于C++类型转换的课后,我又在网上查阅相关资料,以便更清晰详细的 阅读全文
posted @ 2011-07-03 07:34 Ider 阅读(15358) 评论(17) 推荐(2) 编辑
摘要:在C++编程过程中,随着项目的越来越大,代码也会越来越多,并且难以管理和分析。于是,在C++中就要分出了头(.h)文件和实现(.cpp)文件,并且也有了Package的概念。对于以C起步,C#作为“母语”的我刚开始跟着导师学习C++对这方面还是感到很模糊。虽然我可以以C的知识面对C++的语法规范,用C#的思想领悟C++中类的使用。但是C#中定义和实现是都在一个文件中(其实都是在类里面),而使用C的时候也只是编程的刚刚起步,所写的程序也只要一个文件就够了。因此对于C++的Package理解以及.h文件和.cpp文件的总是心存纠结。幸好导师有详细的PPT让我了解,一次对于Package的认识就明白 阅读全文
posted @ 2011-06-30 02:14 Ider 阅读(78905) 评论(10) 推荐(22) 编辑


我的围脖

Fly Me