• 数组的运用、排序


    问题描述                                                 

      在别人的博客上看到起面试经历中的面试题,自己也想实现下,说实话,这道题以前做数据结构的课程设计是做过的,而且这样的题,当时还问了同学的,可是没有自己想,没有上心,到现在也就影响不太深刻了,当时可能也没有很好地理解数组的使用。

    给定一个整型数组,输入一个数字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 }
  • 相关阅读:
    面试官:讲讲redis的过期策略如何实现?
    Java并发-CopyOnWriteArrayList
    Java并发-CopyOnWriteArrayList
    idea万能快捷键,不可不知的17个实用技巧
    Java面试题必备知识之ThreadLocal
    Java面试题必备知识之ThreadLocal
    再谈源码阅读
    再谈源码阅读
    七月伊始 LeetCode算法总结
    ta和夏天一起来了
  • 原文地址:https://www.cnblogs.com/wj204/p/3047149.html
Copyright © 2020-2023  润新知