写了几个问题的代码

This commit is contained in:
nonstriater
2014-05-06 14:38:24 +08:00
parent 967e267774
commit 9d741769df
17 changed files with 449 additions and 74 deletions
+5
View File
@@ -1,6 +1,7 @@
>算法虐我千百遍,我待算法如初恋。
##学习方法
1) 把所有经典算法写一遍
@@ -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
-1
View File
@@ -4,7 +4,6 @@
2.设计包含min函数的栈。
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。
要求函数min、push以及pop的时间复杂度都是O(1)。
+111 -38
View File
@@ -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 。
+37
View File
@@ -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;
}
+23
View File
@@ -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;
}
+71
View File
@@ -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<<i>>(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;
}
+7
View File
@@ -0,0 +1,7 @@
#include "stdio.h"
int main(){
printf("%ld",236432123443*33453098);
return 0;
}
+25
View File
@@ -0,0 +1,25 @@
#include "stdio.h"
/*
1 是第一个元素
序列中元素被2或3或5整除
*/
unsigned long value_in_sequence(unsigned index){
}
int main(){
return 0;
}
+70
View File
@@ -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<high){
mid = (low+high)/2;
if (a[mid]>=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(low<high){
mid = (low+high+1)/2;
if (a[mid]<=key)// 往右找
{
low=mid;
}else{
high = mid-1;
}
}
return low;
}
int element_appear_times(int *a,int length,int key){
printf("(%d) first appear at index %d\n",key,binary_search_first(a,length,key));
printf("(%d) last appear at index %d\n",key,binary_search_last(a,length,key));
return binary_search_last(a,length,key)-binary_search_first(a,length,key)+1;
}
int main(){
int a[] = {2,3,4,4,4,4,4,5,5,7,7,11,11,11,11,11,32,32,54};
printf("(2)appear times = %d\n", element_appear_times(a,sizeof(a)/sizeof(int),2) );
printf("(4)appear times = %d\n", element_appear_times(a,sizeof(a)/sizeof(int),4) );
printf("(11)appear times = %d\n", element_appear_times(a,sizeof(a)/sizeof(int),11) );
printf("(36)appear times = %d\n", element_appear_times(a,sizeof(a)/sizeof(int),36) );
printf("(54)appear times = %d\n", element_appear_times(a,sizeof(a)/sizeof(int),54) );
return 0;
}
+14
View File
@@ -0,0 +1,14 @@
#include "stdio.h"
int main(){
int j,k,m;
int i= (j=4,k=5,m=8);
printf("%d\n", i);
i= (j==4)?:0;
printf("i=%d\n", i);
return 0;
}
Binary file not shown.
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleIdentifier</key>
<string>com.apple.xcode.dsym.a.out</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>dSYM</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>
+53 -25
View File
@@ -1,6 +1,6 @@
3.求子数组的最大和
题目:
题目:求子数组的最大和
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
@@ -8,22 +8,38 @@
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
因此输出为该子数组的和18。
1. 蛮力法 fmax(i,j) 找出最大的值,3重循环 ,复杂度 0(n^3)
2.
最长公共子序列 (动态规划的经典题目)
第21题
编程求解:
输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,
使其和等于 m ,要求将其中所有的可能组合列出来.
输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来.
print_sum_detials(int n , int sum)
动态规划(类似背包问题)
5.查找最小的k个元素
查找最小的k个元素
题目:输入n个整数,输出其中最小的k个。
例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。
print_minimums(int *a,int length ,int k);
第14题:
题目:输入一个已经按升序排序过的数组和一个数字,
在数组中查找两个数,使得它们的和正好是输入的那个数字。
要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。
@@ -31,7 +47,7 @@
1.给出两个集合A和B,其中集合A={name},
给出两个集合A和B,其中集合A={name},
集合B={age、sex、scholarship、address、...},
要求:
问题1、根据集合A中的name查询出集合B中对应的属性信息;
@@ -54,8 +70,6 @@
第6题
给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数
要求下排每个数都是先前上排那十个数在下排出现的次数。
上排的十个数如下:
@@ -76,7 +90,7 @@
第18题:
题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,
每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。
当一个数字删除后,从被删除数字的下一个继续删除第m个数字。
@@ -91,7 +105,6 @@
第23题:
用最简单, 最快速的方法计算出下面这个圆形是否和正方形相交。"
3D坐标系 原点(0.0,0.0,0.0)
圆形:
@@ -108,7 +121,6 @@
32.
有两个序列a,b,大小都为n,序列元素的值任意整数,无序;
要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
例如:
@@ -117,7 +129,7 @@ var b=[1, 2, 3, 4,5,40];
2.一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1;
{3,6}{2,4,3} m=2
{3,3}{2,4}{6} m=3 所以m的最大值为3
@@ -125,7 +137,6 @@ var b=[1, 2, 3, 4,5,40];
36.
n支队伍比赛,分别编号为0,1,2。。。。n-1,已知它们之间的实力对比关系,
存储在一个二维数组w[n][n]中,w[i][j] 的值代表编号为i,j的队伍中更强的一支。
@@ -139,7 +150,7 @@ n支队伍比赛,分别编号为0,1,2。。。。n-1,已知它们之间
1.一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],
一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],
其左边的数都小于等于它,右边的数都大于等于它。
能否只用一个额外数组和少量其它空间实现。
@@ -362,14 +373,13 @@ f(n)= 1 n=1
48.微软:
一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5}
是由{6,5,4,3,2,1}左移两位形成的,在这种数组中查找某一个数。
67.俩个闲玩娱乐。
俩个闲玩娱乐。
1.扑克牌的顺子
从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。
2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。
@@ -451,18 +461,26 @@ double Power(double base, int exponent)
一个有序数列,序列中的每一个值都能够被2或者3或者5所整除,1是这个序列的第一个元素。求第1500个值是多少?
1,2,3,4,5,6,8,9,10,12,14,15,16,...
1)所有的偶数都在序列中
2)3的倍数也在序列中
3)5的倍数也在系列中
unsigned long value_in_sequence(int index)
0. 2,3,5最小公倍数是30
1. [1,30]符合条件有22个
2. [30,60]符合条件也22个
第1500个: 1500/22=68余4,一个周期内的前4个数是2,3,4,5; 最终答案是`68*30+5`
51.和为n连续正数序列。
和为n连续正数序列。
题目:输入一个正数n,输出所有和为n连续正数序列。
例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。
分析:这是网易的一道面试题。
@@ -496,14 +514,24 @@ double Power(double base, int exponent)
15、一个整数数列,元素取值可能是1~N(N是一个较大的正整数)中的任意一个数,相同数值不会重复出现。
一个整数数列,元素取值可能是1~N(N是一个较大的正整数)中的任意一个数,相同数值不会重复出现。
设计一个算法,找出数列中符合条件的数对的个数,满足数对中两数的和等于N+1。
复杂度最好是O(n),如果是O(n2)则不得分。
10、在排序数组中,找出给定数字的出现次数
在排序数组中,找出给定数字的出现次数
比如 [1, 2, 2, 2, 3] 中2的出现次数是3次。
1. 排序数组,可以使用二分查找
将二分操作观测到底,这样在最坏的情况下([2,2,2,2,2,2,2])都有0(lgn)复杂度
int binary_search_first(int *a,int length,int key);
int binary_search_lash(int *a,int length,int key);
53、最长递增子序列
+5
View File
@@ -16,6 +16,11 @@
要求找出所有相反的串对,如abc和cba。
一个文件中有40亿个整数,每个整数为四个字节,内存为1GB,写出一个算法:求出这个文件里的整数里不包含的一个整数
假设一个文件中有9亿条不重复的9位整数,现在要求对这个文件进行排序。
2.给出一个文件,里面包含两个字段{url、size},
即url为网址,size为对应网址访问的次数,
+4
View File
@@ -67,6 +67,10 @@
int i=(j=4,k=8,l=16,m=32); printf(“%d”, i); 输出是多少?
逗号运算符
(表达式1,表达式2,...,表达式n) 分别计算每个表达式,,最后表达式的值做为整个表达式的值
所以输出是32
+2 -8
View File
@@ -1,4 +1,5 @@
链表常常碰到的问题有:
链表反转
链表中是否有环
@@ -10,6 +11,7 @@
判断俩个链表是否相交
给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交。
为了简化问题,我们假设俩个链表均不带环。
@@ -38,12 +40,6 @@ struct ListNode
链表操作,
(1)单链表就地逆置,
(2)合并链表
30、微软面试题:Given a head pointer pointing to a linked list ,please write a function that sort the list
in increasing order. You are not allowed to use temporary array or memory copy
@@ -130,7 +126,6 @@ struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
@@ -152,7 +147,6 @@ struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};