| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2149 人关注过本帖, 2 人收藏
标题:华为的一道面试题--活跃气氛,顺便散分
只看楼主 加入收藏
demonleer
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:483
专家分:1225
注 册:2012-6-4
结帖率:100%
收藏(2)
已结贴  问题点数:100 回复次数:22 
华为的一道面试题--活跃气氛,顺便散分
此题是华为的一道面试题。

发上来的目的是为了活跃下论坛的气氛。

大家踊跃发言,把自己的想法以及代码写上。

最后请各位版主点评下大家的代码以及思路,我根据点评来加分。

程序代码:
#define TIME_TAB_MAX 10
char g_tab_time[MAX_TAB_TIME][6] = 
{
    "22:08",
    "08:31",
    "18:25",
    "21:35",
    "01:35",
    "23:45",
    "00:03",
    "09:34",
    "07:23",
    "09:59"
};

char g_sleep_time[6] = {
  "21:30"

 };

 
用C语言编写函数,从g_time_tab 中找出最接近g_sleep_time的时间,并且printf 出结果。

比方说g_sleep_time为21:30,那么输出的应该是21:35。

如果g_sleep_time为23:59,那么输出的应该是00:03。

题不难,但是不能用atoi等相关的库函数。
搜索更多相关主题的帖子: color 
2012-06-14 22:03
user_qiangzi
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:137
专家分:194
注 册:2011-8-29
收藏
得分:6 
抢沙发。。。。。。。。
2012-06-14 22:06
楚地狂生
Rank: 2
等 级:论坛游民
帖 子:3
专家分:11
注 册:2012-6-6
收藏
得分:6 
先对g_tab_time数组从小到大排序,然后按折半查找的方式,对每一个g_tab_time数组的元素与g_sleep_time的元素求其差的绝对值,那个绝对值最小就输出那个。
2012-06-14 22:33
lonmaor
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:郑州
等 级:版主
威 望:75
帖 子:2637
专家分:6423
注 册:2007-11-27
收藏
得分:0 
未排序,直接比了,数据量小的时候还可以
程序代码:
#define TIME_TAB_MAX 10
char g_tab_time[TIME_TAB_MAX][6] =
{
    "22:08",
    "08:31",
    "18:25",
    "21:35",
    "01:35",
    "23:45",
    "00:03",
    "09:34",
    "07:23",
    "09:59"
};

char g_sleep_time[6] = {
  "21:30"
};

char* nearestTime(char sleep_time[], char tab_time[][6], int TAB_MAX)
{
    int i,t,h,m,n;
    int j;
    int min=60*24;
    for(i=0;i!=TAB_MAX;i++)
    {
        h = (tab_time[i][0] - sleep_time[0]) * 10 + tab_time[i][1] - sleep_time[1];
        m = (tab_time[i][3] - sleep_time[3]) * 10 + tab_time[i][4] - sleep_time[4];
        n = h*60+m;
        n = n > 0? n: (-1)*n;
        if(n < min)
        {
            min = n;
            t = i;
        }
    }
    return tab_time[t];
}

#include <stdio.h>

int main()
{
    printf("%s",nearestTime(g_sleep_time,g_tab_time,TIME_TAB_MAX));
    return 0;
}


从不知道到知道,到知道自己不知道,成长的道路上脚步深深浅浅
2012-06-14 23:17
demonleer
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:483
专家分:1225
注 册:2012-6-4
收藏
得分:0 
回复 4楼 lonmaor
版主的代码写的很简洁。

但是如果休眠时间是23:59的话,你的程序还是输出23:45哦。

应该输出00:03的。
2012-06-14 23:28
邱威
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:136
专家分:351
注 册:2012-3-28
收藏
得分:6 
如果g_sleep_timede 元素与g_tab_time中两个元素的差值相等呢?(23:54与23:45和23:54与00:03)
2012-06-14 23:28
demonleer
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:483
专家分:1225
注 册:2012-6-4
收藏
得分:0 
回复 6楼 邱威
问的好,相等的话就随便输出一个。
2012-06-14 23:29
specilize
Rank: 4
等 级:业余侠客
帖 子:126
专家分:247
注 册:2011-2-20
收藏
得分:6 
首先将所有的时间转换为整数,然后使用堆排序排为从小到大,然后确定g_sleep_time所属区间,为两种情况:若在g_tab_time[min]-----g_tab_time[max],则使用折半查找,通过比较绝对值查找最接近时间,若不在区间g_tab_time[min]-----g_tab_time[max],则首先对g_sleep_time进行取模运算g_sleep_time%(g_tab_time[min]+g_tab_time[max]),然后将结果与g_tab_time[min]和g_tab_time[max]进行比较即可,例如g_tab_time[min]=00:03(整数3),g_tab_time[max]=23:45(整数1425),g_sleep_time=23:59(整数1439),g_sleep_time取模后为11,经过比较,与3最接近,代码略。。。。。。。。
2012-06-15 09:21
lonmaor
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:郑州
等 级:版主
威 望:75
帖 子:2637
专家分:6423
注 册:2007-11-27
收藏
得分:0 
按照提出的bug进行了修正,但是觉得过于臃肿。倾向于将所有时间换算成距前一个00:00的分钟数->排序->比较,一会儿上代码
【代码已删】
如果sleep_time是00:03, time_tab中包含有前一日的23:59,此条件未判断

[ 本帖最后由 lonmaor 于 2012-6-15 10:42 编辑 ]

从不知道到知道,到知道自己不知道,成长的道路上脚步深深浅浅
2012-06-15 09:29
lonmaor
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:郑州
等 级:版主
威 望:75
帖 子:2637
专家分:6423
注 册:2007-11-27
收藏
得分:17 
回复 9楼 lonmaor
同样n1,n2,n3一个用于判断当日time距sleep_time的间隔,一个用于判断下一日time距sleep_time的间隔,一个用于判断前一日time距sleep_time的间隔。
程序代码:
#include <stdio.h>
#include <stdlib.h>

#define TIME_TAB_MAX 10
char g_tab_time[TIME_TAB_MAX][6] =
{
    "22:08",
    "08:31",
    "18:25",
    "21:35",
    "01:35",
    "23:59",
    "01:03",
    "09:34",
    "07:23",
    "09:59"
};

char g_sleep_time[6] = {
    "00:03"
};

int timeToMinute(char* myTime)
{
    return (myTime[0]*10 + myTime[1]) * 60 + (myTime[3]*10 + myTime[4]);
}

char* nearestTime(char sleep_time[], char tab_time[][6], int TAB_MAX)
{
    int sleep_minute = timeToMinute(sleep_time);
    int* tab_minute = (int*) malloc(sizeof(int) * TAB_MAX);
    int i,t,n1,n2,n3;
    int min = 24*60*2;
    for(i=0; i!=TAB_MAX; i++)
    {
        tab_minute[i] = timeToMinute(tab_time[i]);
        n1 = 24*60 + tab_minute[i] - sleep_minute;
        n2 = tab_minute[i] - sleep_minute;
        n2 = n2>0 ? n2: (-1)*n2;
        n3 = 24*60 + sleep_minute - tab_minute[i];
        if(n1 < min)
        {
            min = n1;
            t = i;
        }

        if (n2 < min)
        {
            min = n2;
            t = i;
        }

        if (n3 < min)
        {
            min = n3;
            t = i;
        }
    }
    free(tab_minute);
    return tab_time[t];
}

int main()
{
    printf("%s",nearestTime(g_sleep_time,g_tab_time,TIME_TAB_MAX));
    return 0;
}



[ 本帖最后由 lonmaor 于 2012-6-15 10:49 编辑 ]

从不知道到知道,到知道自己不知道,成长的道路上脚步深深浅浅
2012-06-15 10:38
快速回复:华为的一道面试题--活跃气氛,顺便散分
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020127 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved