问题描述
在别人的博客上看到起面试经历中的面试题,自己也想实现下,说实话,这道题以前做数据结构的课程设计是做过的,而且这样的题,当时还问了同学的,可是没有自己想,没有上心,到现在也就影响不太深刻了,当时可能也没有很好地理解数组的使用。
给定一个整型数组,输入一个数字N时,要输出数组中第N大的数,并把它原来的下标输出来,要求用C语言实现,时间复杂度要求最小,20分钟时间。
代码
View Code
1 #include<stdio.h> 2 int main() 3 { 4 int a[10],b[10],temp,n; 5 printf("请输入数组的长度\n"); 6 scanf("%d",&n); 7 int i=0,j=0,count=0; 8 printf("请输入整形数组的值\n"); 9 while(count<n){ 10 b[count]=count;//记录数组原始的位置 11 //scanf("%d",&temp); 12 // a[b[count]]=temp; 13 scanf("%d",&a[b[count]]); 14 count++; 15 } 16 for(i=0;i<count;i++) 17 for(j=i+1;j<count;j++) 18 { 19 if(a[b[i]]>a[b[j]]) 20 { 21 temp=b[i]; 22 b[i]=b[j]; 23 b[j]=temp; 24 temp=a[b[i]]; 25 a[b[i]]=a[b[j]]; 26 a[b[j]]=temp; 27 } 28 } 29 printf("要输出的N大数为:"); 30 scanf("%d",&temp); 31 printf("最大值是:%d\n",a[temp]); 32 printf("原序列为:%d",b[temp]); 33 return 0; 34 }
总结
加深印象,不过还没有实现其时间复杂度最小的要求,排序的算法现在还不是很熟悉,不过会看到的,到时再来改进一下这个题的解法。
最后作者还说 面试官问了不用辅助空间怎么实现。 也就是说不允许定义一个存放下标的数组。
刚一出Intel大门,突然想到了解决不用辅助空间的方法,唉~反应太迟钝了,第一次遍历下数组,知道了数组最大元素。INT类型的是4个字节,一般整数不会完全用完,可以用4个字节的前2个字节存放它们的下标(前提是这个数小于2^16),这样每次冒泡时,比较它们的低16位就行了,同时下标也跟着元素的交换走了。
这个我不是很懂,怎样让前两个字节存放它们的下标,然后再比较低16位。
今天懂了怎么让前两个字节存放它们的下标,再比较低16位的做法了,代码如下:
View Code
1 #include<stdio.h> 2 int main() 3 { 4 int a[10]; 5 int i=0,n,t,k=0; 6 printf("请输入数组大小:\n"); 7 scanf("%d",&n); 8 while(i<n){ 9 scanf("%d",&a[i]); 10 a[i]=a[i]+(i<<16); 11 i++; 12 } 13 for(int j=0;j<n;j++) 14 for(int h=j+1;h<n;h++) 15 { 16 if((short)a[j]>(short)a[h]) 17 { 18 t=a[j]; 19 a[j]=a[h]; 20 a[h]=t; 21 } 22 } 23 while(k<n){ 24 printf("%d\t %d\n",(short)a[k],(a[k]>>16)); 25 k++; 26 } 27 }