一道笔试题

anliu1234 2012-05-30 06:35:17
只记得大致的内容:


比如输入一个时间“12:18” 在给定String数组里面找到离这个时间最接近的时间,并输出


给定数组里面的值大致是这样的{“01:16”,“06:22”“14:54”“13:35”“12:19”“12:20” }



C或者java都行 看各位有什么较好的解决方法没


...全文
5997 89 打赏 收藏 转发到动态 举报
写回复
用AI写文章
89 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyming 2012-08-18
  • 打赏
  • 举报
回复
如果是同一天的时间,直接排序。
如果题意是认为23点和3点离1点的距离是一样近的,就要换算成分钟,相减,取绝对值,超过12*60分钟的再拿24*60分钟减一下,选最小值
chen_yanhua123 2012-08-18
  • 打赏
  • 举报
回复
[Quote=引用 86 楼 的回复:]

引用 39 楼 的回复:

就是排序

就是这个
直接排 不用转 字符串有大小
[/Quote]
排序的复杂度比较大,转成分钟复杂度低。
而却字符串排序是和float是不同的。9:00>7:00>12:00这是字符串的排序
品茶 2012-08-16
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 的回复:]

就是排序
[/Quote]
就是这个
直接排 不用转 字符串有大小
Mourinho 2012-07-26
  • 打赏
  • 举报
回复
hh:mm(设为H:M)
给定时间Hx:Mx
待测时间Hy:My
相差时间|60*Hx-60*Hy+Mx-My|=|60(Hx-Hy)+(Mx-My)|
然后取最小值即可,可能有2个答案
DarkAnkh 2012-07-26
  • 打赏
  • 举报
回复
说漏了,和指定时间的2个数字相减之后绝对值最小的最接近
DarkAnkh 2012-07-26
  • 打赏
  • 举报
回复
存成键值对,时的数字最小且分的数字最小时为最小也就是最接近……
  • 打赏
  • 举报
回复
[Quote=引用 79 楼 的回复:]
不知道楼主是否认为
23:00和03:00离01:00一样近呢,
[/Quote]
估计是楼主回忆的时候,忘记说所有时间是同一天了!
呵呵……
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 的回复:]
这个题目看应聘者的灵活度和发散思维。
直接小时+分钟求和。
12:18 =30

12:19 =31

最近的就是12:19
[/Quote]
哥们,做题不能看着哪个答案眼熟,就向哪个答案靠近啊!
假如我设定的时间为11:58 ——> 69
而选项为14:00 ——> 14 ,和 10:00 ——> 10 .
难道11:58离14:00近一些?
albert_lz 2012-06-15
  • 打赏
  • 举报
回复
这道题应该改写下,那个时间与当前指定时间的指针夹角最少。。。
albert_lz 2012-06-15
  • 打赏
  • 举报
回复
不知道楼主是否认为
23:00和03:00离01:00一样近呢,
wj539h 2012-06-15
  • 打赏
  • 举报
回复
这种题似乎很常见,用map特别简单就实现了
luomuxiaoxiao98 2012-06-15
  • 打赏
  • 举报
回复
[Quote=引用 76 楼 的回复:]

引用 34 楼 的回复:

C/C++ code


#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
char time[6][6] = {{"01:16"},
{"06:22"},
{"14:54"},
……


非常感谢34楼给出的答案,好像有两个……
[/Quote]

刚才没有粘上去,再试一次:


#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
char time[6][6] = {{"02:16"},
{"06:22"},
{"14:54"},
{"13:35"},
{"23:19"},
{"00:20"}};
char input[6];
printf("Please input a time!\n");
scanf("%s" , input);
int hour = atoi(strtok(input,":"));
int minute = atoi(strtok(NULL,":"));
printf("hour = %d\n",hour);
if(hour >24 ||hour <0 || minute <0 || minute>60)
{
printf("The time you input is invalid!\n");
return 0;
}
int T=(hour == 0) ? 60*(hour+24)+minute : 60*hour+minute; //对输入为00:XX特殊情况的处理
printf("T = %d\n",T);

int i,j,t_hour,t_minute;
j=0; //如果最接近的时间为time[0],则需要对j赋0。
int temp=60*(atoi(strtok(time[0],":")))+atoi(strtok(NULL,":")) - T;

if(temp<0)
temp = -temp ;

for(i=1;i<6;i++)
{
char buf[6] ;
strcpy(buf,time[i]);
t_hour = atoi(strtok(buf,":"));
t_minute = atoi(strtok(NULL,":"));
int num;
printf("%d. t_hour = %d\n",i,t_hour);
if(t_hour == 0) //对time[6][6]中时为0特殊情况的处理
num = 60*(24+t_hour) + t_minute - T;
else
num = 60*t_hour + t_minute - T;
if(num<0)
num = -num;
if(num<temp)
{
temp = num;
j=i;
}
}
printf("The nearest time is %s\n" , time[j] );
return 0;
}
luomuxiaoxiao98 2012-06-15
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 的回复:]

C/C++ code


#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
char time[6][6] = {{"01:16"},
{"06:22"},
{"14:54"},
……
[/Quote]

非常感谢34楼给出的答案,好像有两个bug:
1.没有对j进行初始化,如果time[0][6]是最接近的时间的话,不初始化j程序无法正确运行;
2.没有考虑到time[6][6]和用户输入中包含有:00:XX特殊情况的处理。
以下是我改过的程序,请大家看下还有什么问题没有。
中间件XL 2012-06-08
  • 打赏
  • 举报
回复
一个O(n)的算法,
定义数组,int a[24][60],模拟一个时钟,
即,a[x][y] 就是x点y分
1. 遍历时间数组,元素对应的a元素置为1,其他的0;
2. 从给点时间点对应的数组a元素开始,向前一步,向后一步遍历,
直到找到不为0的a元素,侧,该元素代表的时间点为离指定时间点最近的。
Code_cj 2012-06-04
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 的回复:]

这个题目看应聘者的灵活度和发散思维。
直接小时+分钟求和。
12:18 =30

12:19 =31

最近的就是12:19
[/Quote]

-------19:12=31,是选 19:12么?
aaa2550 2012-06-04
  • 打赏
  • 举报
回复
我觉得不能直接把:去掉变成Integer类型比大小
因为比如是基数是12:59 那么13:00只比它大1秒,12:57比它小两秒
而Integer是十进制的数字,分钟是60进制的数字 这里只会选取12:57而不选取13:00

所以我给出如下源码
public static void main(String[] args) throws ParseException, IOException {
String time = "12:28";
String[] times = {"01:16","06:22","14:54","13:35","12:19","12:20"};
DateFormat date = new SimpleDateFormat("mm:ss");
long timel = date.parse(time).getTime();
long[] timesl = new long[times.length + 1];

for (int i = 0; i < timesl.length-1; i++)timesl[i] = date.parse(times[i]).getTime();
timesl[times.length] = timel;
Arrays.sort(timesl);
long min=0,max=0;
for (int i = 0; i < timesl.length; i++)
if(timesl[i] == timel){
if(i != 1)max = timesl[i-1];
if(i != timesl.length-2)min = timesl[i+1];
}

if((max-timel)<=(timel-min))
System.out.println("这个时间是: " + date.format(new Date(min)));
else
System.out.println("这个时间是: " + date.format(new Date(max)));

}

如果有00:00存在 需要再加几行判断
_jerrytiger 2012-06-04
  • 打赏
  • 举报
回复
更正多个时间差相同的问题 , 判断格式那些小问题, 没必要写出来了吧。

package com.zf.target;

import java.util.Arrays;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;

public class Test5 {

public static List<String> getNear(String target , String... dates){
long targetTime = formatStringToTime(target);
long[] shortTime = new long[dates.length]; //时间差
Map<Long , List<String>> map = new HashMap<Long , List<String>>(); //保存时间差对应的时间
for (int i = 0; i < dates.length; i++) {
long time = formatStringToTime(dates[i]);
shortTime[i] = Math.abs(targetTime - time); //取时间差的绝对值
if(map.containsKey(shortTime[i])) //如果该时间差已经存在
map.get(shortTime[i]).add(dates[i]);
else{
List<String> list = new Vector<String>();
list.add(dates[i]);
map.put(shortTime[i], list);
}
}
Arrays.sort(shortTime); //排序
return map.get(shortTime[0]); //取最小值
}

public static long formatStringToTime(String str){
String[] arr = str.replaceAll("(\\d+):(\\d+)", "$1,$2").split(",");
Calendar c = Calendar.getInstance();
c.set(Calendar.HOUR_OF_DAY, Integer.parseInt(arr[0]));
c.set(Calendar.MINUTE, Integer.parseInt(arr[1]));
c.set(Calendar.SECOND, 0);
return c.getTimeInMillis();
}

public static void main(String[] args) {;
System.out.println(Arrays.toString((getNear("15:02" , new String[]{"01:16"
, "06:22" , "14:54" , "13:35" , "12:19" , "12:20"
, "15:01" , "15:03"
})).toArray()));
}
}
  • 打赏
  • 举报
回复
- - 这个么,看到很多人用遍历,我用的是排序后的二分查找- -
_jerrytiger 2012-06-04
  • 打赏
  • 举报
回复

package com.zf.target;

import java.util.Arrays;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;

public class Test5 {

public static String getNear(String target , String... dates){
long targetTime = formatStringToTime(target);
long[] shortTime = new long[dates.length]; //时间差
Map<Long , String> map = new HashMap<Long , String>(); //保存时间差对应的时间
for (int i = 0; i < dates.length; i++) {
long time = formatStringToTime(dates[i]);
shortTime[i] = Math.abs(targetTime - time); //取时间差的绝对值
map.put(shortTime[i], dates[i]);
}
Arrays.sort(shortTime); //排序
return map.get(shortTime[0]); //取最小值
}

public static long formatStringToTime(String str){
String[] arr = str.replaceAll("(\\d+):(\\d+)", "$1,$2").split(",");
Calendar c = Calendar.getInstance();
c.set(Calendar.HOUR_OF_DAY, Integer.parseInt(arr[0]));
c.set(Calendar.MINUTE, Integer.parseInt(arr[1]));
c.set(Calendar.SECOND, 0);
return c.getTimeInMillis();
}

public static void main(String[] args) {;
System.out.println(getNear("12:03" , new String[]{"01:16"
, "06:22" , "14:54" , "13:35" , "12:19" , "12:20"
, "15:01" , "15:03"
}));
}
}



bree06 2012-06-04
  • 打赏
  • 举报
回复
纠正一下,上面的正则不正确,改为"([01][0-9]|2[0-4]):(0[0-9]|[1-5][0-9])"
主要是为了判断时间格式的,如果确定时间格式都没问题这个判断可以省去
加载更多回复(65)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧