[一道面试题]含有*的字符串匹配问题

归类于编程 5 条评论

Question

字符串1:只含有英文字母
字符串2:含有英文字母和*,其中符号*表示匹配任意字符0或者多次,即正则表达式里面的含义。

现在给定这样的两个串,要求判断是否匹配?
bool isMatch ( const char *str1, const char *str2)

例如:str1 = “hello”, str2 = “he*o”,则二者匹配,返回true,str1 = “hello”, str2 = “he*l”,则不匹配,返回false。

继续阅读

,

快速排序详细分析

归类于编程 5 条评论

快速排序详细分析

注:REF[n]为参考资料,列于文章结尾。

看了编程珠玑Programming Perls第11章关于快速排序的讨论,发现自己长年用库函数,已经忘了快排怎么写。于是整理下思路和资料,把至今所了解的快排的方方面面记录与此。

继续阅读

[备忘]倒置字符串中的单词

归类于编程 参与评论

输入:一个字符串,单词用某个特定符号分割(比如空格)
输出:一个字符串,单词顺序和原串相反

看到倒置,一般的做法是用栈,要么自己建个数组、要么STL,或者递归用程序栈。

优雅的递归

void reverse_token() {
  char str[MAX] = {0};
  if (scanf("%[^#]", str) != EOF)  { //利用scanf的正则式特性
      getchar();
      reverse_token();
      printf("%s ", str);
  } 
}

继续阅读

,

类型转换-无处不在的陷阱

归类于编程 4 条评论

今天在论坛上看有laphon同学的一个问题,觉得这个问题很有意思。
原帖地址
问题援引如下:

做一个小程序的时候发现的。代码如下,使用的编译器为DEV-C++ 4.9.9.2。
如果先要求输入a,再要求输入b,那么a的值无论输入多少(少于255)输出都会是0;
反过来,如果先要求输入b,再要求输入a,那么就会正常。
这是为什么呢?请教达人解释。

#include
#include
 
int main(int argc,char **argv)
{
    unsigned char a,b;
    scanf("%d",&a);
    scanf("%d",&b);
    printf("a=%d,b=%d\n",a,b);
    scanf("%d",&b);
    scanf("%d",&a);
    printf("a=%d,b=%d\n",a,b);
    system("pause");
}

继续阅读

Linux 下 gtkmm + glade 开发

归类于Linux与开源 | 编程 4 条评论

Linux下大多数软件都是将core和UI完全分离,很多程序原作者只提供了CLI接口,而图形化接口则由另一些人完成。这种做法不仅减小了开发难度,缩短了开发周期,松散的耦合使程序更容易移植。这和很多windows程序形成了鲜明对比,尤其是MFC的程序,core代码和UI代码杂糅到doc/view的框架里,完全没有可移植性。

这学期写大作业想做个GUI,就顺便看了下MFC,觉得MFC现在的现在的地位十分尴尬,大型项目几乎清一色SDK,小型应用则是.net的天下,MFC被用的最多的莫过于CString了。一个Application Framwork已经退化成一个单纯的Class Library了。

暑假前的小学期,又有一个不大不小的作业,决定完全在Linux编写,并且Core和UI完全分离,有时间的话想用GTK做GUI。直接用C代码设计一个稍微复杂点GTK界面简直就是自找苦吃,于是上glade。

继续阅读

类继承的开销 ——《Inside the C++ Object Model》笔记二

归类于编程 参与评论

一、不含多态的继承

即基类里没有虚函数。这时候派生类成员的存取时间并没有增加,但是空间上会有浪费。比如有如下两个类

class X {
	int a;
	char b;
};
class Y : public X {
	char c;
};

一个X对象占用4+1+3(padding, 假设4字节对齐) = 8字节。而一个Y对象并不是占用 4+1+1+2(padding)=8个字节,而是占用4+1+3(padding)+1+3(padding)=12个字节。编译器之所以如此设计,是为了使派生类对象中基类对象的内存结构和原始的基类对象一致,这种一致性保证了通过指针复制对象时不出错。如果按照前一种内存布局,会产生错误,比如:

继续阅读

在Archlinux上的安装Tor

归类于Internet | Linux与开源 6 条评论

这几天网络环境急剧恶化,不得不把Tor搬出来

pacman -S tor

发现源里就有, 直接装之。装完以后默认的Socks绑定地址是127.0.0.1 9050, 当然也可以在配置文件里改掉:

sudo vim /etc/tor/torrc

大概在20行的位置,还有就是默认情况下tor是作为服务启动的,如果想改成手动启动,把配置文件里的RunAsDaemon的值从1改成0就行了。

Tor装好后就要给浏览器设置代理了,firefox这种支持socks代理的浏览器直接把socks代理设置为 127.0.0.1 9050就行了,配合switch proxy tools这种切换代理的插件会很方便。像opera、konqueror等不支持socks代理的浏览器就需要privoxy来帮忙了:

继续阅读

, ,

新式标签浏览-Tree Tab

归类于Internet | 新发现 2 条评论

标签式浏览不是什么新鲜东西了,如今只要是浏览器,都支持标签浏览。但是一般的标签浏览网页开多了会很不爽。看RSS的时候随便点点标签栏就爆了,标签变得很窄,显示不出几个字,想找个页面变得无比之难。

前两天在网上闲逛看到有人说“树状标签”,立即到firefox里的add-ons里搜了一下“Tree Tab”,搜出来好几个插件。下了一个叫“Tab Kit”的插件,用了一下果然很爽,如图:

Tab Kit

继续阅读

构造函数 ——《Inside the C++ Object Model》笔记一

归类于编程 参与评论

Inside the C++ Object Model Chapter 2 : The Semantics of Constructor 构造函数语义学

一、默认构造函数 Default Constructor

C++编译器会在Class的每一个构造函数中通过添加代码的方法暗中(implicit)做了下面几件事:

  1. 如果在这个构造函数没有对所有Member Class Object进行构造, 编译器会调用余下没有构造的Member Class Object的默认构造函数;
  2. 如果此构造函数没有提供基类构造函数的参数列表, 编译器会调用基类的默认构造函数;
  3. 如果类中含有虚函数,编译器会利用构造函数产生一张virtual function table(vbtl),并在每个Class Object中添加一个vprt(指向vbtl的指针);
  4. 如果类有Virtual Base Class虚基类,编译器会在构造函数中添加代码, 允许每个虚基类的执行期存取操作。

继续阅读

, ,

我和Linux

归类于Linux与开源 参与评论

响应CasparAnt的号召,写了一下自己玩Linux的过程

老早我爸就开始玩Linux,不过没有装X,所以也就望而却步。直到大一遇到班上某牛S(现在投身ACM去了)玩Linux,又在宏福听了一场开源的讲座,兴趣大发,开始折腾。

我装Linux的过程那是相当曲折,Ubuntu7.04装完Grub引导出问题,那时候还不知道grub为何物,Google了N久发现ubuntu自带Grub和原来Vista Loader的Grub4Dos冲突,索性用Vista的安装盘把Vista Loader卸了,再把ubuntu重装了一遍(那时候还不会修复Grub),黑屏…又瞎折腾了几天,无果,就先扔一边去了。

过了两周,S牛不知从哪淘来一盒FC6,随便试了一下,竟然能进X了,第一次看到Gnome的桌面,那叫一个激动啊。兴奋了半天,发现缺各种驱动:显卡、声卡、网卡…没法上网、没法更新,除了玩玩小游戏,啥都做不了…于是乎又扔一边去了。

到了11月份,从遥远的波兰寄来的ubuntu 7.10的光盘到了,赶快装上,顺利进入X,以太网卡也能用了,赶紧插上根网线更新。还记得一条apt-get我至少Google了四五次才记住。接着就是解决无线网卡驱动的问题,Google到ndiswrapper,又折腾了一周。然后尝试各种软件,无休止的折腾。

继续阅读

顶部