一道笔试题

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


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


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



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


...全文
6002 89 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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)
企业公司软件测试面试笔试题集合 软件测试面试题 (测试基础).doc 01_企业面试试卷(综合).doc 01_企业面试试卷(综合)_参考答案.doc 04_企业面试试卷(测试基础).doc 04_企业面试试卷(测试基础)_参考答案.doc 500强公司面试的经典正确与错误回答对比!!! 看看你的弱点.doc C面试题.txt Java初学者都必须知道的六大问题.doc 百度笔试题.txt 北京博彦科技笔试+面试.doc 北京大学计算机科学技术研究所.doc 波尔世通的笔试+面试.doc 测试人员面试题.doc 测试题.doc 常见的测试题(转贴).doc 传视数码公司的面试题.doc 汉端笔试题(7页).doc 合力金桥的笔试题.doc 华为面试题.doc 经典逻辑题.ppt 联合网视面试题.doc 美国英网软件公司题目.doc 面试考题(腾讯,招行等等).txt 某公司的面试试题.doc 奇虎面试题.doc 千像互动的笔试.doc 清华同方开发的面试题 (有兴趣的看一下了 !).doc 缺陷的等级划分,一个经常被问到的问题.doc 软件测试工程师笔试试题(大集合).doc 软件测试工程师测试试题大集合(二)包括答案.doc 软件测试工程师试题发布版.doc 软件测试试题.doc 软件评测复习知识点(小颖).doc 软通动力面试笔答.doc 瑞星笔试题(15道).doc 神州泰岳测试试题(笔试)转贴.doc 时力科技面试题.doc 瓦瑟笔试题(限男性).doc 喜安科 面试题.doc 性能计算公式.txt 亚控科技比试题.doc 一道测试notepad笔试题.doc 一道数据库的笔试题目.doc 一个外包测试公司的笔试题!.doc 一家通讯公司的面试题目.doc 英文自我介绍大全.doc 英语面试.doc 英语面试题.doc 有意思的逻辑题.doc 中软的面试题(转贴).doc

62,634

社区成员

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

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