算法100题Word文件下载.docx
- 文档编号:21833079
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:6
- 大小:18.35KB
算法100题Word文件下载.docx
《算法100题Word文件下载.docx》由会员分享,可在线阅读,更多相关《算法100题Word文件下载.docx(6页珍藏版)》请在冰豆网上搜索。
{
while(!
isdigit(*s))
s++;
if(isdigit(*s))
pcompare=s;
while(isdigit(*s))
clen++;
}
if(clen>
llen)
llen=clen;
plong=pcompare;
//clen=0;
clen=0;
for(i=0;
i<
llen;
i++)
outputstr[i]=plong[i];
outputstr[i]='
;
returnllen;
}
intmain()
charinstr[]="
intlen;
char*out=instr;
len=continuemax(out,instr);
printf("
%d,%s\n"
len,out);
return0;
/*题目来自:
*题目14:
输入一个已经按升序排列过的数组和一个数字,在数组中找出两个数,使的它们的和正好等于这个数字
*如1,2,4,7,11,15和数字15,则可以输出4和11
*方法:
(可见《编程之美》)
初始化i,j分别指向数组开头和结尾,因为数组升序排列,则若arr[i]+arr[j]大于输入数,则可以确定此刻的arr[j]必不满足条件,因为它与最小的数字相加
*都大于输入数,则可以缩小范围(j--),同理可以处理i直至满足条件。
*/
1#include<
stdio.h>
2
3voidfind(int*a,intlen,intx)
4{
5inti,j;
6for(i=0,j=len-1;
j;
)
7{
8if(a[i]+a[j]==x)
9{
10printf("
%d,%d\n"
a[i],a[j]);
11return;
12}
13elseif(a[i]+a[j]>
x)
14j--;
15else
16i++;
17}
18printf("
nosuchnums\n"
);
19}
20
21intmain()
22{
23intarr[]={1,2,4,7,11,15};
24intlen=sizeof(arr)/sizeof(arr[0]);
25find(arr,len,15);
26return0;
27}
*题目54:
输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数数组位于数组的后半部分。
*可以借助快速排序中分成两个部分的思想:
取数组中的一个数,移动元素使得数组前半部分的数小于基准数,后半部分大于基准数。
*用i标示当前元素,j标示最后一个为奇数的下标,若i处数为奇数,则与j+1处的数更换位置,更新i,j即可。
3voidswap(int*a,inti,intj)
5inttemp;
6temp=a[i];
7a[i]=a[j];
8a[j]=temp;
9}
10
11voidfunc(int*a,intn)
12{
13inti,j;
14j=-1;
15for(i=0;
n;
16{
17if(a[i]%2!
=0)
18swap(a,++j,i);
19}
20}
21
22voidprint(int*a,intlen)
23{
24inti;
25for(i=0;
len;
26printf("
%d"
a[i]);
27printf("
\n"
28}
29
30intmain()
31{
32intarr[]={3,4,98,4,3,2,77,2,25};
33intlen=sizeof(arr)/sizeof(arr[0]);
34func(arr,len);
35print(arr,len);
36
37return0;
38}
则输出为:
3,3,77,25,4,2,98,2,4
*一个数组由一个递减数列左移若干位形成,如{4,3,2,1,6,5}由{6,5,4,3,2,1}左移两位而成在这种数组中查找某一个数
*方法1:
遍历数组查找次数,O(n)
*方法2:
----------------------
*设原数列为:
a0,...,an,移位后形成的数列为:
b0,...,bn,
*且有ai=bj,则满足j=(i+len-m)%len
(m为移位位数)
*要求得某数位置,可先求得次数在原数列中的位置再按上面公式计算而来。
*可以先求出数列中的最大值,已知数列长度及递减步长,则可以求得在原数列中的位置
*求最大数:
*1.先求步长,设为t
*t=b[1]-b[0]ifb1<
b0
*t=b[0]-b[len-1]ifb1>
*2.设b为按照b[0]为起始数,步长为t,长度为len的数列的最后一个数,则:
*b=b[0]+(len-1)*t
*
则数列中最大的数max=b[len-1]-b
求数x在原数组中的位置:
p=(x-max)/t
*-----------------------*/
1//求得步长
2intstep(int*a,intlen)
3{
4intt;
5if(a[0]>
a[1])
6t=a[1]-a[0];
7if(a[0]<
8t=a[0]-a[len-1];
9returnt;
10}
11
12intfind(int*a,intlen,intx,intstep)
13{
14intb,max,p,pr,m;
15
16b=a[0]+(len-1)*step;
17max=a[len-1]-b;
18p=(x-max)/step;
//原位置
19m=(a[0]-max)/step;
//移位位数
21pr=(p+len-m)%len;
22returnpr;
23}
24
25intmain()
26{
27intarr[]={4,3,2,1,6,5};
28intlen=sizeof(arr)/sizeof(int);
29intp=find(arr,len,1,step(arr,len));
30printf("
%d\n"
p);
31
32return0;
33}
1.什么是散列:
一种高效的数据存储与检索技术,普通数组概念的推广,散列表不把关键值作为数组下标,而是通过设计好的散列函数,将关键值映射到数组下标范围内的一个索引值,通过这个索引值来完成对值的插入、查找、删除等操作。
实际情况中,因为散列表的下标范围通常小于实际存储的数据量,所以难免出现不同的关键值散列到同一个索引位置的情况,这时就称发生了冲突,解决冲突可以通过两个方法来进行:
∙设计好的散列函数,能将关键字均匀的散列到表中;
∙采用某种冲突解决方法
2.散列函数
简单一致散列假设:
任何关键字散列到表中每个位置的可能性是相同的,且散列到某个位置的可能性与其他关键字是独立无关的
将关键字转换为数字:
为什么要这样做呢,因为计算索引值时通常是对数字来进行的,而关键字可能是字符串等复杂的数据结构,所以必须通过某种转换将其解释为数字来进行后续计算。
∙除法散列:
h(k)=kmodm;
其中m的选取很关键,m不宜为2的幂,常选取为与2的整数幂不太接近的常数
∙乘法散列:
h(k)=m(kAmod1)(小于此值的最大整数)
m一般为2的某个幂,A是大于0小于1的某个常数
∙全域散列:
在一组散列函数中随机的选取一个,使之独立于要存储的关键字,随机化保证了没有哪一种输入会始终导致最坏情况性态,同时对于不同时刻的同一样的输入,每次执行时的性态也是不一样的
3.冲突解决
链接法
链接法中,当发生不同的关键字散列到同一个索引位置时,将其放到一个链表中,通过在链表头执行插入操作来进行。
在简单一致散列假设下,采用链接法解决冲突的散列表一次不成功查找和一次成功查找的期望时间为O(1+a)(a=n/m一个链中平均节点数)
开放寻址法
在开放寻址法中,当到来一个对于某个关键字的某种请求时(插入、查找、删除),按照某散列函数计算的探测序列对表中的相应位置上的状态与请求进行匹配,当符合请求时,执行相应的操作。
当执行查找时,在探测序列各节点上进行以下操作:
若节点key与查找的key相同,则返回节点;
若节点未存储元素,则返回;
若以前存储过但已被删除,则探测下一个序列节点直到找到或为空。
插入操作基于查找,对于查找返回的结果要么为空要么匹配到了,对于空的,则在此位置插入,匹配的则更新节点的属性。
删除时不能直接删除查找到的元素,因为如果直接删除的话,如果后来到来一个查找操作,而此节点位置正好在探测序列上,探测在此处终止而无法对序列后续节点进行探测。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 100