笔记IT面试Word文件下载.docx
《笔记IT面试Word文件下载.docx》由会员分享,可在线阅读,更多相关《笔记IT面试Word文件下载.docx(32页珍藏版)》请在冰豆网上搜索。
//这个要注意
a[i]=a[a[i]];
a[k]=-1;
}
if(a[i]==i)
{a[i]=-1;
}
}
returnfalse;
2平面上N个点,没两个点都确定一条直线,求出斜率最大的那条直线所通过的两个点
1.先把N个点按x排序。
2.斜率k最大值为max(斜率(point[i],point[i+1]))
0<
=i<
n-2。
复杂度Nlog(N)。
以3个点为例,按照x排序后为ABC,假如3点共线,则斜率一样,假如不共线,则可以证明AB或BC中,一定有一个点的斜率大于AC,一个点的斜率小于AC。
3strcpy只能处理字符串;
如果拷贝带有特殊字符的串,就只能用memcpy或memmove。
memcpy和memmove功能基本上差不多,但是当源串和目标串有Overlap时,memmove可以正确处理,memcpy则不行
Memset把buffer所指内存区域的前count个字节设置成字符c。
说明:
返回指向buffer的指针。
用来对一段内存空间全部设置为某个字符。
void*memcpy(void*dst,constvoid*src,size_tcount);
void*memmove(void*dst,constvoid*src,size_tcount);
externvoid*memset(void*buffer,intc,intcount);
void*__cdeclmemcpy(void*dst,constvoid*src,size_tcount)
{
void*ret=dst;
while(count--)
*(char*)dst=*(char*)src;
dst=(char*)dst+1;
src=(char*)src+1;
}
return(ret);
//
十进制转换为二进制,十进制数的每1bit转换为二进制的1位数字
char
*int_to_bin(unsigned
long
data)
{
int
bit_num
=
sizeof(unsigned
long)
*
8;
*p_bin
new
char[bit_num+1];
p_bin[bit_num]
'
\0'
;
for
(unsigned
i
0;
<
bit_num;
++i)
p_bin[i]
data
>
(bit_num-1);
if
(p_bin[i]
==
0)
0'
else
1)
1'
a'
}
return
p_bin;
十进制转换为十六进制,十进制数的每4bit转换为十六进制的1位数字
*int_to_hex(unsigned
*p_hex
char[sizeof(unsigned
long)*8/4+3];
p_hex[0]
p_hex[1]
x'
p_hex[bit_num/4+2]
*p_tmp
p_hex
+
2;
bit_num/4;
p_tmp[i]
(4*i)
(bit_num-4);
(p_tmp[i]
0
9)
+=
if(p_tmp[i]
10
15)
-
A'
p_hex;
//十进制转换为二进制,十进制数的每1bit转换为二进制的1位数字
char*int_to_bin(unsignedlongdata)
intbit_num=sizeof(unsignedlong)*8;
char*p_bin=newchar[bit_num+1];
p_bin[bit_num]='
for(unsignedinti=0;
i<
bit_num;
++i)
{
p_bin[i]=data<
i>
(bit_num-1);
if(p_bin[i]==0)
p_bin[i]='
elseif(p_bin[i]==1)
else
returnp_bin;
//十进制转换为十六进制,十进制数的每4bit转换为十六进制的1位数字
char*int_to_hex(unsignedlongdata)
char*p_hex=newchar[sizeof(unsignedlong)*8/4+3];
p_hex[0]='
p_hex[1]='
p_hex[bit_num/4+2]='
char*p_tmp=p_hex+2;
bit_num/4;
p_tmp[i]=data<
(4*i)>
(bit_num-4);
if(p_tmp[i]>
=0&
p_tmp[i]<
=9)
p_tmp[i]+='
elseif(p_tmp[i]>
=10&
=15)
p_tmp[i]=p_tmp[i]-10+'
returnp_hex;
最长不降序子序列
//result存储最长单调递增子序列的长度,minInMax存储长度为i的最长递增子序列中的末尾元素中的最小值
voidlis2(vector<
int>
&
array,vector<
result)
vector<
minInMax(array.size());
inti,low,high,mid;
result[0]=1;
minInMax[result[0]]=array[0];
for(i=1;
array.size();
++i)
if(array[i]>
minInMax[result[i-1]])//当前元素值大于array[0·
·
i-1]序列中最长递增子序列中的最大值的最小值
{
result[i]=result[i-1]+1;
minInMax[result[i]]=array[i];
}else
result[i]=result[i-1];
low=0;
high=result[i-1];
mid=(low+high)/2;
while(low<
=high)//由于minInMax是递增的,所以使用二分查找确定array[i]应该放在哪个位置上
{
if(array[i]>
minInMax[mid])
{
low=mid+1;
}else{
high=mid-1;
}
mid=(low+high)/2;
}
minInMax[low+1]=array[i];
整数的素数和分解问题
对于一个给定的整数,输出所有这种素数的和分解式,对于同构的分解只输出一次(比如5只有一个分解2+3,而3+2是2+3的同构分解式)。
example:
对于整数8,可以作为如下三种分解:
(1)8=2+2+2+2
(2)8=2+3+3
(3)8=3+5
思路:
f(N,array)=f(N-array[i],array),保存结果,array是保存里面元素值,即所有素数,如果素数只能唯一使用一次,那么就建立对应的一个bool数组即可,每使用一次就标记为true,然后递归函数之后需要重新置为false,对于本题不需要如此,但是需要将保存结果的数组除去当前尝试的素数。
代码不难写出:
/*
*Copyright(c)2011alexingcool.AllRightsReserved.
*/
vector<
result;
prvec;
voidoutputResult(intN,vector<
prime,vector<
result)
if(N<
0)
return;
if(N==0){
copy(result.begin(),result.end(),ostream_iterator<
(cout,"
"
));
cout<
endl;
for(inti=0;
prime.size();
i++){
//为提高效率,可以在此做个判定条件,尽快返回
if(N-prime[i]<
break;
result