随笔分类 -  Algo

算法相关
摘要:用程序实现ipv4地址字符串是否合法,主要考察的是C字符串的操作。搜索了下,网上没有特别好的实现,自己实现了下,见笑于大家,请指正。#include #include int valid_ip_segment(const char* begin, const char* end) { int len = end - begin; if (len 4) { return -3; // unvalid_length } int sum = 0; while (begin 255) { return... 阅读全文
posted @ 2013-10-10 21:18 westfly 阅读(912) 评论(0) 推荐(0) 编辑
摘要:刷题,求单词的翻转。利用到了编程珠玑上的翻手法则。主要思路是先将字符串整体翻转,再在单词内部翻转(先单词翻转,在整体翻转貌似也行)。#include #include #include char* string_reverse(char* first, char* last) { char* ptr = first; while (first = last) { return NULL; } string_reverse(first, last); printf("in %s\n", first); char* head_ptr = first; char* sep_ptr 阅读全文
posted @ 2013-09-17 19:12 westfly 阅读(260) 评论(0) 推荐(0) 编辑
摘要:bitmap是一个十分有用的结构。所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。适用范围:可进行数据的快速查找,判重,删除如下是实现的代码示例,用C实现,bitmap的起始位置为0#include #include #include typedef struct bitmap { size_t capacity; char* bit_array;}bitmap_t;int bitmap_init(bitmap_t* bitmap, const size_t capacity)... 阅读全文
posted @ 2013-09-17 19:07 westfly 阅读(505) 评论(0) 推荐(0) 编辑
摘要:输入:非负整数n。输出:如输入3,则输出1~999。基本的方法涉及到大数,通过用字符串模拟加法运算。知识点:判断溢出逆序打印字符串基本的代码如下#include #include #include size_t inc_num(char* num_str, size_t len) { int i = 0; int carrier = 0; num_str[0] += 1; do { if (num_str[i] > 9) { carrier = 1; num_str[i] -= 10; } else { carrier = 0; } ... 阅读全文
posted @ 2013-08-31 12:14 westfly 阅读(215) 评论(0) 推荐(0) 编辑
摘要:按照stl的接口实现。相关源码如下,缺少异常处理的log,但不影响使用。#include #include templateclass StackQueue { public: StackQueue() {} ~StackQueue() {} void push(const T& value) { last.push(value); } const T& top() { stack_exchange(); if (first.size() > 0) { return first.top(); } // empty(); } bool emp... 阅读全文
posted @ 2013-08-31 12:09 westfly 阅读(222) 评论(0) 推荐(0) 编辑
摘要:最长公共子序列,英文缩写为LCS(LongestCommonSubsequence)。定义:一个序列S,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则S称为已知序列的最长公共子序列。两个字符串的最长子序列并不要求字符串连续,只要求有序,即统计两个字符串有多少个重复的字符。用动态规划的思路做。设C[i][j]记录以X[i]为结尾的字符串与Y[j]为结尾的字符串的LCS的长度,分两组情况考虑:1)X[i]==Y[j],则C[i][j]的结果可以根据C的定义通过C[i-1][j-1],得到2)X[i]/=Y[j],则转化为C[i][j-1]和C[i-1][j]的结果,具体公 阅读全文
posted @ 2013-03-18 23:29 westfly 阅读(221) 评论(0) 推荐(0) 编辑
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1282水题。跟在创新工场遇到的一个问题类似,整数串判断回文。由于题目所称整数的限制,数组的大小不是太好取。参考网上的经验值。#include <stdio.h>#define MAX_ARRAY 100int ReserveNum(int a){ int ret = 0; while(a) { ret = ret *10 + a%10; a /=10; } return ret;}int main(){ int first,last; ... 阅读全文
posted @ 2012-03-17 17:40 westfly 阅读(299) 评论(0) 推荐(0) 编辑
摘要:水题http://acm.hdu.edu.cn/showproblem.php?pid=3787关键点:1)整数范围表示所需要的字符串长度。2)字符串转化为整数的函数。看代码#include <stdio.h>#define MAX_ARRAY 16int StringToNum(char *str);int main(){ char Aarray[MAX_ARRAY],Barray[MAX_ARRAY]; while(scanf("%s%s",Aarray,Barray)!= EOF) { //printf("%s\t%s\n",Aarra 阅读全文
posted @ 2012-03-17 15:02 westfly 阅读(290) 评论(0) 推荐(0) 编辑
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1235刚开始没有注意题目。效率不高。数组直接开到N了。View Code #include <stdio.h>#define MAX_ARRAY 1000int main(){ int scores[MAX_ARRAY]; int nTotal; int focus; int i; while(scanf("%d",&nTotal) &&nTotal) { for(i = 0; i < nTotal; ++i) { ... 阅读全文
posted @ 2012-03-17 10:24 westfly 阅读(202) 评论(0) 推荐(0) 编辑
摘要:刷水题。http://acm.hdu.edu.cn/showproblem.php?pid=1412给你两个集合,要求{A} + {B}.注:同一个集合中不会有两个相同的元素.Input每组输入数据分为三行,第一行有两个数字n,m(0<n,m<=10000),分别表示集合A和集合B的元素个数.后两行分别表示集合A和集合B.每个元素为不超出int范围的整数,每个元素之间有一个空格隔开.Output针对每组数据输出一行数据,表示合并后的集合,要求从小到大输出,每个元素之间有一个空格隔开.求两个集合的和。我用的是vector,后来感觉应该用set的。就当熟悉stl的了。#include 阅读全文
posted @ 2012-03-16 23:09 westfly 阅读(377) 评论(0) 推荐(0) 编辑
摘要:完美笔试的最后一题,只写了个+,准备用+模拟*的,回来看网上的资料,发现自己写得不对,于是回来花写时间写了下,各种心得。实现思路很简单,用数组实现,同时用一个len表示占用空间,由于加法和乘法都要求对齐,所以按照数字的逆序表示要方便些,若要输出的话逆向输出即可(在此复习了下ostream 和friend 语义)。数组是字符串的集合,要保持字符串的特有的'\0'结尾符。下面的代码不求完美,但求思路,所以用了固定数组,同时不支持负数形式。加法的实现比较简单,有点类似于归并的代码,注意最后要更新len和末尾结束符。乘法借用的是网上的思路,用了一个临时数组(注意大小,如何证明不会溢出? 阅读全文
posted @ 2011-10-16 23:27 westfly 阅读(1264) 评论(0) 推荐(0) 编辑
摘要:求1+2+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句题目比较变态。起初不愿意多想,只知道模板的发现是由于某人发现在编译打出的错误信息计算出了值,于是才有后面的故事。第一想法的静态模板编译递归计算。后来看到一个比较好的,是用表达式作为防御性编程——作为递归的条件(无判断),比较巧妙,于是sharing一下。#include <stdio.h>int sum(int n){ int tmp = 0; (n)&&(tmp = sum(n-1)); return n+tmp;}int main(){ p 阅读全文
posted @ 2011-10-11 09:59 westfly 阅读(543) 评论(1) 推荐(0) 编辑
摘要:关于二叉树节点的经典定义struct Node { int data; struct Node *left; struct Node *right;};后序非递归实现void PostTravelNoRecure(struct Node *root){ stack<struct Node*> st; struct Node * prev = NULL;//最近一次访问节点 struct Node * pNode = root;//最近一次访问节点 while(pNode||!st.empty()) { //找到最左节点... 阅读全文
posted @ 2011-09-27 10:32 westfly 阅读(248) 评论(0) 推荐(0) 编辑
摘要:部分文字摘自《程序员面试题精选100题(51)-顺时针打印矩阵 》题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:如果输入如下矩阵:12345678910111213141516则依次打印出数字1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10。对于该题,作者举例两个就得出 “让循环继续的条件是columns > startX * 2 && rows > startY * 2。”,实在不是能够理解。所以参考评论中的解答,写出如下代码。请重点关注二维数组作为参数的传递问题,参考《C++中 阅读全文
posted @ 2011-08-22 19:14 westfly 阅读(277) 评论(0) 推荐(0) 编辑
摘要:编程之美关于求一个整数二进制数一的个数后面的一道思考题。1.A和B两个数,将A变成B,所需要改变的数字个数(二进制数)。异或求出异或值二进制包含的1的个数。 #include <stdio.h> int func(int A, int B) { int M= A ^ B; int num=0; printf("%d\n",M); while(M!=0) { M &= (M-1); num++; } return num; } int main() { int A, B; A=0x10; B=0x11; printf("%d\n", f 阅读全文
posted @ 2011-07-05 09:17 westfly 阅读(173) 评论(0) 推荐(0) 编辑
摘要:看到BaiDu的笔试题一道。已知一个字串由GBK汉字和ansi编码的数字字母混合组成,编写C语言函数实现从中去掉所有ansi编码的的数字和字母(包括大小写),要求在原字串上返回结果。函数接口为:int filter_ansi(char* gbk_string)。注:汉字的GBK编码范围是 0x8140 - 0xFEFE。其实这题的思想与 在字符串中删除特定的字符 类似,事实上还要简单,因为没有过滤规则(参考博文后一个参数可以看成是过滤规则)。汉字编码常用的有GBK和GB2312,一般用双字表示,为了区分ansi编码,其最高位一般为1。下面写成代码如下#include <stdio.h&g 阅读全文
posted @ 2011-07-01 14:45 westfly 阅读(1511) 评论(0) 推荐(0) 编辑
摘要:Print an integer using only putchar. Try doing it without using extra storage.1)void printInt(int a){ int b = a; char *str; int i = 1; int len = 0; while (b) { b /= 10; i *= 10; len++; } i /= 10; while (i > 0) { putchar(a/i + 48); a = a%i; i /= 10; }} 2)Thiscanbedonebyrecursion.Sincethenumberofre 阅读全文
posted @ 2011-06-17 20:19 westfly 阅读(202) 评论(0) 推荐(0) 编辑
摘要:在Linux中,链表有list与hlist的区别,其各自定义如下struct list_head { struct list_head *next, *prev; };struct hlist_head { struct hlist_node *first; };struct hlist_node { struct hlist_node *next, **pprev; };可以看出,其都为双向链表。双头(next,prev)的双链表对于Hash表来说“过于浪费”,因而另行设计了一套Hash表专用的hlist数据结构——单指针表头双循环链表,hlist的表头仅有一个指向首节点的指针,而没有指向尾 阅读全文
posted @ 2011-05-30 14:28 westfly 阅读(3747) 评论(0) 推荐(0) 编辑
摘要:贴代码#include <stdio.h>/***********************************************************************************Tango是微软亚洲研究院的一个试验项目。研究院的员工和实习生们都很喜欢在Tango上面交流灌水。传说,Tango有一大“水王”,他不但喜欢发贴,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子总数的一半。如果你有一个当前论坛上所有帖子(包括回帖)的列表,其中帖子作者的ID也在表中,你能快速找出这个传说中的Tango水王吗?***************** 阅读全文
posted @ 2011-05-17 15:41 westfly 阅读(193) 评论(0) 推荐(0) 编辑
摘要:以下文字摘自 http://zhedahht.blog.163.com/blog/static/25411174200952174133707/题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。例如输入数组{32, 321},则输出这两个能排成的最小数字32132。请给出解决问题的算法,并证明该算法。分析:这是09年6月份百度新鲜出炉的一道面试题,从这道题我们可以看出百度对应聘者在算法方面有很高的要求。这道题其实是希望我们能找到一个排序规则,根据这个规则排出来的数组能排成一个最小的数字。要确定排序规则,就得比较两个数字,也就是给出两个数字m和n,我们需要确定 阅读全文
posted @ 2011-05-17 13:47 westfly 阅读(344) 评论(0) 推荐(0) 编辑