From 9d741769df1d0dd5682556ce2e8dff40be1d945f Mon Sep 17 00:00:00 2001 From: nonstriater <510495266@qq.com> Date: Tue, 6 May 2014 14:38:24 +0800 Subject: [PATCH] =?UTF-8?q?=E5=86=99=E4=BA=86=E5=87=A0=E4=B8=AA=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 +- 算法问题选编/堆和栈.md | 1 - 算法问题选编/数值问题.md | 149 +++++++++++++----- 算法问题选编/数值问题/1.c | 37 +++++ 算法问题选编/数值问题/2.c | 23 +++ 算法问题选编/数值问题/3.c | 71 +++++++++ 算法问题选编/数值问题/4-1.c | 7 + 算法问题选编/数值问题/5.c | 25 +++ 算法问题选编/数值问题/6.c | 70 ++++++++ 算法问题选编/数值问题/7.c | 14 ++ 算法问题选编/数值问题/a.out | Bin 0 -> 8456 bytes .../数值问题/a.out.dSYM/Contents/Info.plist | 20 +++ .../a.out.dSYM/Contents/Resources/DWARF/a.out | Bin 0 -> 9547 bytes 算法问题选编/数组数列问题.md | 80 +++++++--- 算法问题选编/海量数据处理.md | 5 + 算法问题选编/算法面试100题 | 4 + 算法问题选编/链表.md | 10 +- 17 files changed, 449 insertions(+), 74 deletions(-) create mode 100644 算法问题选编/数值问题/1.c create mode 100644 算法问题选编/数值问题/2.c create mode 100644 算法问题选编/数值问题/3.c create mode 100644 算法问题选编/数值问题/4-1.c create mode 100644 算法问题选编/数值问题/5.c create mode 100644 算法问题选编/数值问题/6.c create mode 100644 算法问题选编/数值问题/7.c create mode 100755 算法问题选编/数值问题/a.out create mode 100644 算法问题选编/数值问题/a.out.dSYM/Contents/Info.plist create mode 100644 算法问题选编/数值问题/a.out.dSYM/Contents/Resources/DWARF/a.out diff --git a/README.md b/README.md index be2f356..c7483fe 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ >算法虐我千百遍,我待算法如初恋。 + ##学习方法 1) 把所有经典算法写一遍 @@ -8,7 +9,7 @@ 3) 加入算法学习社区,相互鼓励学习 4) 看经典书籍 - + ##基本数据结构和算法 @@ -126,6 +127,10 @@ http://www.chinaunix.net/old_jh/23/437639.html ## 参考链接和学习网站 +POJ http://openjudge.cn/ +这有个POJ上的ACM训练方案 http://www.java3z.com/cwbwebhome/article/article19/res041.html + + 微软面试100题 http://blog.csdn.net/column/details/ms100.html 程序员编程艺术 http://blog.csdn.net/v_JULY_v/article/details/6460494 diff --git a/算法问题选编/堆和栈.md b/算法问题选编/堆和栈.md index e32d1bd..d8c8bb7 100644 --- a/算法问题选编/堆和栈.md +++ b/算法问题选编/堆和栈.md @@ -4,7 +4,6 @@ - 2.设计包含min函数的栈。 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。 要求函数min、push以及pop的时间复杂度都是O(1)。 diff --git a/算法问题选编/数值问题.md b/算法问题选编/数值问题.md index 260ff8a..d5f955e 100644 --- a/算法问题选编/数值问题.md +++ b/算法问题选编/数值问题.md @@ -1,28 +1,131 @@ + + 写一个函数,检查字符是否是整数,如果是,返回其整数值。 (或者:怎样只用4行代码编写出一个从字符串到长整形的函数?) +分析: +使用递归实现 +int string_to_integer(char *s,int length) +单要思考几个问题: +1. s是空字符串 +2. s传参为非数字字符 +3. 超出整数所能表示范围 + -第12题 题目:求1+2+…+n, 要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。 +分析: +1. 不能使用循环,那就用递归 +2. 递归需要终止递归的条件判断语句,这里也不能用if,想其他办法,可以使用 || 逻辑或运输符 -28.整数的二进制表示中1的个数 +整数的二进制表示中1的个数 题目:输入一个整数,求该整数的二进制表达中有多少个1。 例如输入10,由于其二进制表示为1010,有两个1,因此输出2。 + 分析: 这是一道很基本的考查位运算的面试题。 包括微软在内的很多公司都曾采用过这道题。 +解法1:循环计数 +解法2:位运算 +解法3:num &= num-1 巧妙之处在于,对高位没有影响 +请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句 + +分析: +#define min(a,b) ((a)>(b)?(a):(b)) +#define MIN(A,B) ({ __typeof__(A) __a = (A); __typeof__(B) __b = (B); __a < __b ? __a : __b; }) + + + + +1024! 末尾有多少个0? + +分析: +末尾0的个数取决于2和5的个数 +能被2整除的数比能被5整除的数要多得多,因此只统计被5整除的数的个数 +?? + + + +编程实现:把十进制数(long型)分别以二进制和十六进制形式输出,不能使用printf系列 + +分析: +char *integer_to_hex(long i); +char *integer_to_bin(long i); + +注意,转16进制中,要判断tmp[i]是否是有符号的数 +tmp[i]= tmp[i]>=0?tmp[i]:tmp[i]+16; + + + +大整数乘法(或 大整数阶乘) +请使用代码计算1234567891011121314151617181920*2019181716151413121110987654321 。 + +1. 注意结果可能超出长整形的最大范围 2^64-1 +2. 采用分治算法,将大整数相乘转换为小整数计算 + + + + +编程实现两个正整数的除法(和取模) +编程实现两个正整数的除法,当然不能用除法操作符。 +// return x/y. +int div(const int x, const int y) +{} + +1. 循环减被除数,减到不能再减,当除数很大,被除数小时,效率很低 +2. 位运算 + + + + +两个数相乘,小数点后位数没有限制,请写一个高精度算法 + + + + + + +如何求根号2的值,并且按照我的需要列出指定小数位,比如根号2是1.141 我要列出1位小数就是1.1 2位就是1.14, 1000位就是1.141...... 等。。 + +分析: +泰勒级数 +牛顿迭代法 + + + +求两个或N个数的最大公约数和最小公倍数。 + + + + + + +40、用1、2、2、3、4、5这六个数字,写一个main函数,打印出所有不同的排列, +如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连. + + + + + + + +给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), +指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。 + +比如,A=[1,0] K=21 那么输出结构应该为100。 + + 58、整数的素数和分解问题 @@ -44,40 +147,17 @@ -给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), -指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。 - -比如,A=[1,0] K=21 那么输出结构应该为100。 - - - - -请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句 - -两个数相乘,小数点后位数没有限制,请写一个高精度算法 - -编程实现:把十进制数(long型)分别以二进制和十六进制形式输出,不能使用printf系列 - -如何求根号2的值,并且按照我的需要列出指定小数位,比如根号2是1.141 我要列出1位小数就是1.1 2位就是1.14, 1000位就是1.141...... 等。。 -求两个或N个数的最大公约数和最小公倍数。 - - - -40、用1、2、2、3、4、5这六个数字,写一个main函数,打印出所有不同的排列, -如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连. - - - -21、1024! 末尾有多少个0? - - - 30.在从1到n的正数中1出现的次数 题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。 例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。 分析:这是一道广为流传的google面试题。 +int one_appear_count(int n); +1. 遍历1~n,统计出现1的个数;n足够大时,效率很低 +2. 分析规律 + + @@ -85,21 +165,14 @@ 说明:当然不能使用开方运算。 + 20、给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数。 -9、编程实现两个正整数的除法 -编程实现两个正整数的除法,当然不能用除法操作符。 -// return x/y. -int div(const int x, const int y) -{} - - -请使用代码计算1234567891011121314151617181920*2019181716151413121110987654321 。 diff --git a/算法问题选编/数值问题/1.c b/算法问题选编/数值问题/1.c new file mode 100644 index 0000000..67829ea --- /dev/null +++ b/算法问题选编/数值问题/1.c @@ -0,0 +1,37 @@ + +#include "stdio.h" +#include "string.h" + +int string_to_integer(char *s,int length){ + + if (length>1) + { + return s[0]=='-'?string_to_integer(s,length-1)*10-(s[length-1]-'0'):string_to_integer(s,length-1)*10+s[length-1]-'0'; + }else{ + return s[0]=='-'?-1/10:s[0]-'0'; + + } +} + +/* 问题: +1. s是空字符串 +2. s传参为非数字字符 +3. 超出整数所能表示范围 +*/ + + +int main(){ + + char *s = "4323"; + + printf("integer == %d\n",string_to_integer(s,strlen(s)) ); + printf("integer == %d\n",string_to_integer("12342",5)); + printf("integer == %d\n",string_to_integer("-11",3) ); + printf("integer == %d\n",string_to_integer("-5",2) ); + printf("integer == %d\n", string_to_integer("3",1)); + + printf("integer == %d\n", string_to_integer("abcd",4)); + printf("integer == %d\n", string_to_integer("a",1)); + + return 0; +} diff --git a/算法问题选编/数值问题/2.c b/算法问题选编/数值问题/2.c new file mode 100644 index 0000000..b8f86c9 --- /dev/null +++ b/算法问题选编/数值问题/2.c @@ -0,0 +1,23 @@ + +#include "stdio.h" + + +int factorial(int n){ + + int ret=0; + (n==0) || (ret=n+factorial(n-1)); + return ret; +} + + +int main(){ + + int n=10; + printf("factorial(10)= %d\n",factorial(10)); + printf("factorial(5)= %d\n",factorial(5)); + printf("factorial(1)= %d\n",factorial(1)); + printf("factorial(0)= %d\n",factorial(0)); + + return 0; +} + diff --git a/算法问题选编/数值问题/3.c b/算法问题选编/数值问题/3.c new file mode 100644 index 0000000..669624e --- /dev/null +++ b/算法问题选编/数值问题/3.c @@ -0,0 +1,71 @@ + +#include "stdio.h" +#include "stdlib.h" + +char *integer_to_bin(long integer){ + + int bit_num = sizeof(long)*8; + char *buffer= (char *)malloc(bit_num+1); + if (buffer==NULL) + { + return "malloc error"; + } + buffer[bit_num]='\0'; + + for (int i = 0; i < bit_num; ++i) + { + buffer[i]= integer<>(bit_num-1); + buffer[i]= buffer[i]==0?'0':'1'; + + } + return buffer; + +} + +char *integer_to_hex(long integer){ + + int bit_num=sizeof(long)*8/4; + char *buffer=(char *)malloc(bit_num+3); + buffer[0]='0'; + buffer[1]='x'; + buffer[bit_num+2]='\0'; + char *tmp=&buffer[2]; + + for (int i = 0; i < bit_num; i++) + { + tmp[i]= integer<<(i*4)>>(bit_num*4-4); + tmp[i]= tmp[i]>=0?tmp[i]:tmp[i]+16; + tmp[i]= tmp[i]<10?(tmp[i]+48):(tmp[i]-10+'A'); + } + + return buffer; +} + + +/* + +A 65 +0 48 + +*/ + + + +int main(){ + + + printf("b(11) = %s\n", integer_to_bin(11)); + printf("b(1023) = %s\n",integer_to_bin(1023) ); + printf("b(23564) = %s\n",integer_to_bin(23564) ); + + + printf("h(11) = %s\n", integer_to_hex(11)); + printf("h(1023) = %s\n",integer_to_hex(1023) ); + printf("h(23564) = %s\n",integer_to_hex(23564) ); + printf("b(11) = %x\n", 11); + printf("b(1023) = %x\n",1023 ); + printf("b(23564) = %x\n",23564 ); + + + return 0; +} \ No newline at end of file diff --git a/算法问题选编/数值问题/4-1.c b/算法问题选编/数值问题/4-1.c new file mode 100644 index 0000000..806e7d3 --- /dev/null +++ b/算法问题选编/数值问题/4-1.c @@ -0,0 +1,7 @@ +#include "stdio.h" + +int main(){ + + printf("%ld",236432123443*33453098); + return 0; +} \ No newline at end of file diff --git a/算法问题选编/数值问题/5.c b/算法问题选编/数值问题/5.c new file mode 100644 index 0000000..4df163b --- /dev/null +++ b/算法问题选编/数值问题/5.c @@ -0,0 +1,25 @@ + + +#include "stdio.h" + + +/* + + 1 是第一个元素 + 序列中元素被2或3或5整除 + +*/ +unsigned long value_in_sequence(unsigned index){ + + + + +} + + +int main(){ + + + + return 0; +} \ No newline at end of file diff --git a/算法问题选编/数值问题/6.c b/算法问题选编/数值问题/6.c new file mode 100644 index 0000000..926f346 --- /dev/null +++ b/算法问题选编/数值问题/6.c @@ -0,0 +1,70 @@ + + +#include "stdio.h" + +int binary_search_first(int *a,int length,int key){ + + int low=0; + int high = length-1; + int mid = 0; + + while(low=key)//往左找 + { + high = mid; + }else{ + + low = mid+1; + } + + } + return high; + +} + +int binary_search_last(int *a,int length,int key){ + + int low = 0; + int high = length -1; + int mid = 0; + + while(lowX(2)p5h-H)zTMe&v$cIzm;)y>-h_7dUp)JSaozPwnNG^=NGf(EDTi{ICF8kaxbeMp@&B~*sS>12_AM7L zg!%LjD1TyaJnmyJUN~3BdX678yL;R-5%#SUm=aLMFpjsbT{yQ9I)t6v0kkgHwiy_u zhzMHxkspp1fq5<_&>lj&4tf&m75cjBwR`)o!oKsR2660Il4ydq<+GW#WFpo!Fp?Yq zrfh?lJIUqoMm zGz0$@181Y9FVWFzBs$*y43$;PU#zcU{^Y}M#r)29$%;A4$MlL>WiytqJ{8l0=-s$( zdj;>mzWuKF*$6)W_T#ltGN()V$>1$coZ(aQm^oQ8Kh3O1_XSiCupKi$A!(OwsX9TM z0bX*fWPT{kMn~U9F1{((S{}f1YqvvJ9s%~Uxv#V?uT)CeJUf$A`@!v zkVCkD&J6-V42k>r6*3iA7e=PcZH_tAZ4sxOfiE&MpqASQOu7vgs2J~r_S3O_^C zeRZIF(6Dd(?14=-cD`@8-#^gK&*A-`7dz=-6rzLuFm8Gm*Cy@S+;uEkDdznF$~Nxp literal 0 HcmV?d00001 diff --git a/算法问题选编/数值问题/a.out.dSYM/Contents/Info.plist b/算法问题选编/数值问题/a.out.dSYM/Contents/Info.plist new file mode 100644 index 0000000..3679a65 --- /dev/null +++ b/算法问题选编/数值问题/a.out.dSYM/Contents/Info.plist @@ -0,0 +1,20 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleIdentifier + com.apple.xcode.dsym.a.out + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + dSYM + CFBundleSignature + ???? + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/算法问题选编/数值问题/a.out.dSYM/Contents/Resources/DWARF/a.out b/算法问题选编/数值问题/a.out.dSYM/Contents/Resources/DWARF/a.out new file mode 100644 index 0000000000000000000000000000000000000000..b61ec8e916c939f9e0c2dfc875291231fc0d6793 GIT binary patch literal 9547 zcmeHNT}&KR6uvY2!3gY&(+-1BIx+m*M6n0EAI95DFmw+T zujr)I)aT3{PdnauKO_&`3rK(v%*PTpS+LsBpfqRZBRR`t$Gcv|@hU72u1nP?@OI)u zJQ~-N89mGJi}SrD@LD7Q)X2RhyW)%H%xuDl2?u+8HPt+xMGK&~QG^X$l;(}ugfT@E z#&nwL#qq5OJe>1Vgi<|Dr?cUd&b{sNT^D$`=A;x%jWk&`u9M%OP&yQv2w7%=>+){v z1aW1)lp0BzyO@fklQd&y_r)t*c7<`_d`c{gg3@I8PIxsUzWwlU9T%>{oqaVn`sAtM zp;5UfG+Ukma2|sIK^(>d)A;`U5&{Rl&V)`sDy&d-+i*1AbqY5V2;yMAuw9r?I;BVQ zF&d6Uvii*ac(cNvXtJ?)ZQ*6ZMoiD`if>lLH!g0UEfG&F+g*6q1YSsxbFDhx7NTh|hOeH1?@vzL|W)fX$GzCwEY!*gtS3Z7%(Y0=bU zdX}1L8c7&MdR(6)G!+J`BMt)&0}cZY0}cZY0}cZY0}cZY0}cZY0}cZY1OE>LO0Cjb z74W#KYLyyqGrVk8gNm!_g#ST*Tg7PLk&0TSP8oy`16&@$&7%PoRCiyI>hS|k9h?t% zTfqLX-w&?|%c{v}fDm8M^4viqV~`ylJwQLZ%HxI`Od~`dH&8rt0FlQH-9qQqo$E=k z3p@o~D###QB`W$2K~eFox8hNjv67v`;$%aabTPZqT?g#KS(UlSiyCblNdPvodgeAGEUYBL8i`Kb5u zQRD7!5J;0Td?v>JSU~X@4qGw!zD4%|)D_8}{5(OK^nMS$9=G>LtbF7{s8n(f-l67TgX|R+AqP}RT4VV}Uab$P4fStqsE6v+V*&O4>OWqEr2)4cP-T{`gLT|7 z{|b2jtOn}U&Vc%KKs{IWr}UMfx%%tM)uskj3#donuYp|yYHL7k#J^3|57;MJm~bKZ z;ua65Y$r|c7Mt*}sUAG7^QI2y=L-b^aC)NgaF!rRfJAT>l4&ERp~57DuPwE)vB@X2 z89kdzqz$b<*sZlklklRtv%kAL*b{u<_))Dr63*#U8gw(?-e7NT#yHBj>v}c^cXp-1 z(XJsq_q>_TbdBlZtkD@t#?sk@8BgW9HdmK#UR~N+Ufud&WozNJ&5gIZZZ56gSlHku zdzvC^5=ofU$frmoKRpfSZV8@E0Vha+naXeiFexj$k!M09kS%+w?}8du6BD#4;`huUxtC@;mdDpR8QLjf5W`OhI8Q8){@7g{?TKk#ZEa-=M~cLa~o2zw&THACBpQ zZ+ASz4=peA{|5x2wB}o{cP}jZquSE^IOs7bFG0b@i~TrlEii1yiz}cJT-s>HSq1Y) i?I&1rxF^w!vkvAnKfUlKw5*`83&l