两个数组元素相同,顺序不同,进行正确匹配
2015-04-02 10:30
3043 查看
面试宝典中87页中面试例三,不再叙述原题。大意即是有两个数组a和b,两个数组的元素相同,但是顺序不同,写一个算法求出数组a和数组b中元素之间的对应关系。题意要求不能对同一个数组中的两个元素进行比较,也不能去取数组元素中的特定值进行比较。只能进行a和b元素之间的比较。
利用双重循环的时间复杂度为O(n^2),根据书中提示的优化方法定义一下数据结构
typedef struct {
int loc_b;
int flag;//-1,0,1分别表示b[loc_b]<,=,>a[loc_a]
int loc_a;
}C;
数组定义如下
C c
;
int a
;
int b
;
利用快排的思想和二分查找的思想对数组进行比较。利用a[0]初始化数组c,其中数组前半部分表示b[j]<a[0],后面部分表示b[j]>a[0].同时记录k,使得b[k]==a[0],以后对a数组进行比较时均与b[k]进行比较,(因为不让同数组之间进行比较).
void _match(){
int head=0;
int tail=N-1;
int i,j,k;
i=rand()%N;
//初始化赋值
for(j=0;j<N;j++){//类似与按照a[i]的值对b进行快排
if(b[j]>a[i]){//从后向前插入到c
c[tail].flag=1;
c[tail].loc_a=i;
c[tail].loc_b=j;
tail--;
continue;
}
if(b[j]<a[i]){//从前向后插入到c
c[head].flag=-1;
c[head].loc_a=i;
c[head].loc_b=j;
head++;
continue;
}
if(b[j]==a[i]){
k=j;//记录相等时候的位置
}
}
c[head].flag=0;
c[head].loc_a=i;
c[head].loc_b=k;
//endfor
for(i=0;i<N;i++){
if(a[i]<b[k]){//a[i]小于b[k]时候,从c的前面进行比较
for(j=0;j<head;j++){
if(b[c[j].loc_b]==a[i]){
c[j].flag=0;
c[j].loc_a=i;
break;
}
}
}else if(a[i]>b[k]){//从c的后面比较
for(j=head+1;j<N;j++){
if(b[c[j].loc_b]==a[i]){
c[j].flag=0;
c[j].loc_a=i;
break;
}
}
}
}
}
进行测试
int main(){
int i=0;
for(i=0;i<N;i++){
a[i]=i;
b[i]=N-i-1;
}
_match();
for(i=0;i<N;i++){
cout<<"b["<<c[i].loc_b<<"] match a["<<c[i].loc_a<<"]"<<endl;
}
return 0;
}
利用双重循环的时间复杂度为O(n^2),根据书中提示的优化方法定义一下数据结构
typedef struct {
int loc_b;
int flag;//-1,0,1分别表示b[loc_b]<,=,>a[loc_a]
int loc_a;
}C;
数组定义如下
C c
;
int a
;
int b
;
利用快排的思想和二分查找的思想对数组进行比较。利用a[0]初始化数组c,其中数组前半部分表示b[j]<a[0],后面部分表示b[j]>a[0].同时记录k,使得b[k]==a[0],以后对a数组进行比较时均与b[k]进行比较,(因为不让同数组之间进行比较).
void _match(){
int head=0;
int tail=N-1;
int i,j,k;
i=rand()%N;
//初始化赋值
for(j=0;j<N;j++){//类似与按照a[i]的值对b进行快排
if(b[j]>a[i]){//从后向前插入到c
c[tail].flag=1;
c[tail].loc_a=i;
c[tail].loc_b=j;
tail--;
continue;
}
if(b[j]<a[i]){//从前向后插入到c
c[head].flag=-1;
c[head].loc_a=i;
c[head].loc_b=j;
head++;
continue;
}
if(b[j]==a[i]){
k=j;//记录相等时候的位置
}
}
c[head].flag=0;
c[head].loc_a=i;
c[head].loc_b=k;
//endfor
for(i=0;i<N;i++){
if(a[i]<b[k]){//a[i]小于b[k]时候,从c的前面进行比较
for(j=0;j<head;j++){
if(b[c[j].loc_b]==a[i]){
c[j].flag=0;
c[j].loc_a=i;
break;
}
}
}else if(a[i]>b[k]){//从c的后面比较
for(j=head+1;j<N;j++){
if(b[c[j].loc_b]==a[i]){
c[j].flag=0;
c[j].loc_a=i;
break;
}
}
}
}
}
进行测试
int main(){
int i=0;
for(i=0;i<N;i++){
a[i]=i;
b[i]=N-i-1;
}
_match();
for(i=0;i<N;i++){
cout<<"b["<<c[i].loc_b<<"] match a["<<c[i].loc_a<<"]"<<endl;
}
return 0;
}
相关文章推荐
- 比较两个数组元素是否相同,顺序可以不同,维数必须一样
- 假设两个字符串中所含有的字符和个数都相同我们就叫这两个字符串匹配, 比如:abcda和adabc,由于出现的字符个数都是相同,只是顺序不同, 所以这两个字符串是匹配的。要求高效!
- 有两等长数组A,B,所含元素相同,但顺序不同,只能取得A数组某值和B数组某值进行比较,比较结果为大于,小于,等于,但是不能取得同一数组A或者B中两个数进行比较,也不能取得某数组中的某个值
- 相同数组不同的顺序的匹配
- asp两个数组如何进行比较,剔除相同,保留不同
- go判断两个字符串是否是是相互打乱的,也就是说它们有着相同的字符,但 是对应不同的顺序。
- 编写一个函数,判断两个字符串是否是是相互打乱的,也就是说它们有着相同的字符,但是对应不同的顺序。
- leetcode之两个数组元素相同还是不同
- 不同包下,相同数据结构的两个类进行转换
- 汇编 输入几个数子进行比较 不同条输出不同的结果 三个相同输出2 两个同输出1 不同输出0
- 同一个数据库里,两个相同字段但是顺序不同的数据表合并教程
- c# 对两个Datatable的结构相同进行合并,结构相同和不同
- javascript 常见数组操作( 1、数组整体元素修改 2、 数组筛选 3、jquery 元素转数组 4、获取两个数组中相同部分或者不同部分 5、数组去重并倒序排序 6、数组排序 7、数组截取slice 8、数组插入、删除splice(需明确位置) 9、数组遍历 10、jQuery根据元素值删除数组元素的方)
- MySQL中同一字段值对应的两个不同的值进行连接
- asp.net下比较两个等长字符串是否含有完全相同字符(忽略字符顺序)
- 比较两个等长字符串是否含有完全相同字符(忽略字符顺序)
- 将两个顺序表合成一个新的顺序表,并进行排序
- id相同名称不同多条数据,名字进行累加
- MD5值相同的两个不同的文件
- 匹配一个字符串,它由0、1、2组成,并且中间没有两个相邻的数字是相同的(比如,匹配1232101210321020,而不匹配1100123)