徐少春,金蝶集团创始人。
从他身上看到了湖南人直爽豪迈的个性。
在青春年少的时候,痴迷于文学小说,极富想象力。
两面墙的藏书,可以看出来他是一个爱读书的人。
最喜欢的小说是《约翰克里斯多夫》,并用书中的一句话作为自己奋斗的座右铭:
人生所有的欢乐都是创造的欢乐:爱情、天才、行动–全靠这团火喷射出来。–罗曼·罗兰
参考文学作品中主人翁的生活,浪漫的规划自己的美好未来。
踏踏实实的去奋斗。
在创业初期,骑车去推销自己的产品。销售额突破百万。可以想见,他不仅仅在计算机编程上很牛,同时还是一个杰出的销售人员。
在创业中,遇到合作伙伴叛离后另起炉灶,他能够毫不手软的将对方弄死。个性强势。
浪漫主义和英雄主义相结合,极富个人魅力的企业家。
思路分析:
1、最简单的方式是调用系统函数int atoi(const char *nptr)把字符转换为整型数。
2、自己实现:第一个字符需要判断一下,为空则返回0;是负号,则要记录下来;
3、char型的BIT4、BIT5置为零即为对应整数;或者减去字符’0′即为对应数字;
4、从头到尾逐步扫描,直到’\0′结束,将前面的计算结果放大十倍,加上当前值。
Source Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | int String_To_Integer(char *p) { int sign, result, tmp; if( *p == NULL) return 0; if( *p == '-') { sign = -1; p++; } else { sign = 1; } result = 0; while( *p ) { //char型的BIT4、BIT5置为零即为对应整数 tmp = *p & (~0x30); //多位数情况,第一次是乘1,此后是放大10倍 result *= 10; result += tmp; p++; } return result*sign; } int main(int argc, char* argv[]) { printf("%d\n", String_To_Integer("1234789")); printf("%d\n", String_To_Integer("")); printf("%d\n", String_To_Integer("-1234589")); return 0; } |
思路分析:
将字符串的首地址传到处理函数中,从头到尾扫描一遍,直到’\0′结束
小写字母和大写字母的ASCII相差32,也即是0×20
将小写字母的BIT5清零即为对应的大写字母,反之亦然。
Source Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | //String_Covert_Upper将一个字符串中的字符从小写转为大写 void String_Covert_Upper(char *p) { while(*p) { if(*p >= 'a' && *p <= 'z') { //置BIT5为0 *p = *p & ~0x20; } p++; } } //String_Covert_Lower将一个字符串中的字符从大写转为小写 void String_Covert_Lower(char *p) { while(*p) { if(*p >= 'A' && *p <= 'Z') { //置BIT5为1 *p = *p | 0x20; } p++; } } int main(int argc, char* argv[]) { char string1[] = "hello,WORLD"; printf("%s\n",string1); String_Covert_Upper(string1); printf("%s\n",string1); String_Covert_Lower(string1); printf("%s\n",string1); return 0; } |
运行如下程序,输出结果是什么?
Source Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | char* GetString1() { char p[] = "GetString1"; return p; } char* GetString2() { char *p = "GetString2"; return p; } int main(int argc, char* argv[]) { printf("GetString1 :%s. \n", GetString1()); printf("GetString2 :%s. \n", GetString2()); return 0; } |
运行结果分析:
1、编译提示:warning C4172: returning address of local variable or temporary
GetString1()中的p[]数组是GetString1()的局部变量,会在函数的栈空间上分配内存
当函数运行结束,内存空间会被释放。所以返回数组首地址p的时候,会显示乱码。
2、GetString2()中的*p是一个指针,指向的是字符常量区的一个常量字符串。并不会
在GetString2()退出的时候被释放掉。因此会显示GetString2
题目:文件中有一组整数,写出完整代码将其排序后输出到另一个文件中
思路:
1、想办法从文件中将数据读入内存;fopen、fscanf、fprintf的正确调用
2、文件大小未知,所以要注意可增长数组的应用;malloc、realloc的正确调用
3、排序可以调用qsort系统函数。
Source Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | #include "stdafx.h" #include <stdlib.h> //升序排列,从小到大 int comp_ascending(const void *a,const void *b) { return *(int *)a-*(int *)b; } //降序排列,从大到小 int comp_descending(const void *a,const void *b) { return *(int *)b-*(int *)a; } int main(int argc, char* argv[]) { int i; int data_count; //统计整数的个数 int MAX = 10; int *data_buffer = (int *)malloc(MAX * sizeof(int)); int *b; FILE *src; FILE *dest; //1.文件名 2.打开模式 src = fopen("data.txt", "r"); if(src == NULL) { printf("error1"); exit(-1); } dest = fopen("output.txt", "w"); if(dest == NULL) { printf("error2"); exit(-1); } i= 0; data_count = 0; //1.文件流指针 2.格式串 3.缓冲数组 while(fscanf(src, "%d", &data_buffer[i]) != EOF) { i++; data_count++; if(i >= MAX) { MAX *= 2; //数组动态增长 1.数组名 2.大小 b = (int *)realloc(data_buffer,MAX * sizeof(int)); if(b == NULL) { printf("error3"); exit(-1); } data_buffer = b; } } printf("before sort:\n"); for(i = 0; i < data_count; i++) { printf("%d\n", data_buffer[i]); } //1.数组名 2.元素个数 3.元素占用空间大小 4.自定义比较函数 qsort(data_buffer, data_count, sizeof(data_buffer[0]), comp_ascending); printf("\nafter sort:\n"); for(i = 0; i < data_count; i++) { printf("%d\n",data_buffer[i]); } for(i = 0; i < data_count; i++) { //1.指向所要写的文件指针 2.格式串 3.输出数据 fprintf(dest, "%d\n", data_buffer[i]); } fclose(src); fclose(dest); return 0; } |
昨天YWW去面百度了,回来后,我找他聊了一会儿。他告诉我,这次百度非常的重视数据结构和算法的考察。在技术笔试的时候碰了《编程之美》上面关于链表操作的一道原题。在面试现场,更是直接让他在白纸上写出两个有序链表的去重合并。
给我的启示:夯实基本功,多看多思多练,勤记录!
strcpy函数原型,是T、B、MS喜欢考察的。先写下来,后面还要回头复习。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /* strcpy函数原型 */ // strDest是目的字符串,strSrc是源字符串 char *strcpy(char *strDest, const char *strSrc) { //有一个指向NULL if (strDest == NULL || strSrc == NULL) return NULL; //已经指向同一个位置,直接返回头指针 if (strDest == strSrc) return strDest; //先记录下头指针的位置,因为后面strDest++会移动改变指向 char *strhead = strDest; //表达式(*strDest++ = *strSrc++)的值就是*strDest, //所以可以和'\0'直接比较 while( (*strDest++ = *strSrc++) != '\0' ); return strhead; } |
注意:
1、两个 if 特殊情况的考虑;
2、指针为空的判断,否则程序会出错。
3、两个串已经相等,就不需要再复制操作了,这在串比较长的时候,可以节省很多时间。
在工具栏空白处点击右键,选择“自定义”,然后在打开的“自定义”窗口中选择“命令”选项卡,在“类别”列表框中选择“格式”,在其右侧的列表中即可找到“删除线”,将“删除线”按钮用鼠标左键按住,拖拽到工具栏就可以了。
字符串反转在面试过程中经常被涉及。所以需要熟练的掌握正确的写法,并能够在面试现场写出代码。
Source Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | int string_reverse_first() { char* src = "hello,world"; int len = strlen(src); char* dest = (char*)malloc(len+1); //+1是为\0分配一个空间 char* d = dest; char* s = &src[len-1]; while( len-- != 0) *d++=*s--;//重新开辟一个新的空间,逐一拷贝 *d = '\0';//串尾需要手工添加结束符 printf("%s\n",dest); free(dest); return 0; } int string_reverse_second() { char src[] = "hello,world"; int len = strlen(src); char tmp; for(int i=0; i<len/2; i++) { tmp = src[i]; src[i] = src[len-i-1];//在原地进行左右交换 src[len-i-1] = tmp; } printf("%s\n",src); return 0; } |
1、string_reverse_first思路是重新开辟一个空间,扫描原来的串,逐个拷贝过来。容易遗漏的是要为\0分配空间,并在串尾添加\0。
2、string_reverse_second思路是首先计算出串的长度,然后串头和串尾元素分别交换,一直扫描到串中间位置停止。和方法一相比空间和时间复杂度都要低,所以高效。
昨晚临睡洗脚的时候在翻看俞敏洪的《从容一生》,看完这篇演讲致辞,很受鼓舞,引发了自己的一些反思。
今天和QT在一起聊俞敏洪的故事,他告诉我说有人评价俞敏洪并不是特别的厉害,倒是他能够将一帮聪明的人聚集在一起干大事,最后成功的办成了新东方。我想,能够团结这些有能力的人,本身就是一个优秀领导者的卓越风范和个人魅力的体现。
相对于俞敏洪的大学同学来说,他在学习成绩上并不是特别的突出,毕竟北大是国内的一流学府,而他相对于其他学校的人,智商上还是不一般的。但是,作为班级上的落伍者,他保持着向优秀同学学习的态度,尤其是他的班长王强,读书癖好正是效仿王强的。并持续不断的追赶,像蜗牛一样,每天比其他同学多学习一两个小时,慢慢的往上爬。最后,到达了金字塔的顶端。而某些自负有天赋的人,忘了后天努力的重要,反而却被自己的锋芒所刺到,而碌碌无为。
他大学五年期间读了八百多本书,可见接收的知识有多么的渊博。这一点北大做的很好,学校里面有良好的学习氛围,同学们之间在相互“攀比”着看书。而如今,时代变迁,电子产品泛滥,我的身边能够静下心来看本书的同学已经寥寥无几,很多人是泡在了互联网上,漫无目的的接收一些碎片式的信息。大学期间没有工作和生活的压力,可以有时间和精力来构建自己的知识库,是一件多么美好的事情。很遗憾,他们并没有意识到。
八十年代是中国现代诗歌浪潮的一个鼎盛时期,俞敏洪也是在这波人之中,他说自己在生病住院的一年中写了六百多首诗,有着丰富的内心情感,自谦表达能力并不强,所以都没有发表。他虽然没做成诗人,可是读诗和写诗这一样高尚的精神活动,让他如今依然散发着浪漫主义情怀的气质。
人要立志,心怀远大的理想,渴望穿越地平线,看到一番别样新奇的风景,所以需要不断努力的奋斗。同时,还要有分享精神,能够将自己的财富、思想、感情拿出来和身边的同学朋友家人一起分享。恰恰是大学四年期间帮宿舍人打了四年的水,这样一种行动,感染了他最初的创业伙伴,并答应回国和他一起创业。
把每天平凡的日子过好,踏踏实实的做事学习,不敢说伟大的人生,至少是有所作为的一生。当回首往事的时候,热泪盈眶的为自己曾经所付出的努力而感动。人唯有勤奋求知,先感动自己,才会感动别人,最后感动上天。所谓自助者,天助之,终会成就自己有意义的一生。
在《编程之美》的书评中发现了一个关于宏操作的小题目。
写一个简单的宏,来判断一个无符号数是否属于:{ 0, 1, 2, 4, 8, 16, …2^n}。
参考网络上的解法,发现他的答案其实有问题。
思路:
将数用2进制展开,如果满足是2的幂,其中必然有一位是1,其他都是0。
在这个1的前面都是0,后面也都是0。此时,如果对这个数减1,排在1前面仍都是0,1后面的所有位都变成了1。于是将它和减1的结果执行与操作,结果必然是0。
结论:
用位与运算,如果这个整数位与比它小1的结果为0的话,它就是2的n次幂,否则不是。
程序如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #define Judge_ND(C) ((C&(C-1)) == 0 ? 1 : 0) //用位与运算,如果这个整数位与比它小1的结果为0的话,它就是2的n次幂,否则不是 int main(int argc, char* argv[]) { for(unsigned int j=0; j<= 1000000; j++) { if(Judge_ND(j)) { printf("%d\n",j); } } return 0; } |
运行结果:
0
1
2
4
8
16
32
64
128
256
512
1024
2048
4096
8192
16384
32768
65536
131072
262144
524288