昨天去公司面试,问了这么个算法问题。。。。。。

xxisxx 2003-02-13 02:59:51
昨天去了个外企面世,笔试的时候刚开始还觉得这些不该是程序员的问题,想是应该能拿满分!可就有这么一道,没做出来。。。。。。
题目很简单,没几行
…… 用24bit来表示一个时间段,他有两种情况:
1)在同一天里的情况
10点 -- 20点
上位 下位
1111 1000 0000 0001 1111 1111

2)不在同一天里(过0点的)
19点 -- 9 点
上位 下位
0000 1111 1111 1100 0000 0000

时间段在24小时内,没有垮多天的情况,请用算法实现

有兴趣的一起探讨~~~~~~~


...全文
58 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
tmj 2003-03-10
  • 打赏
  • 举报
回复
up
meady 2003-03-05
  • 打赏
  • 举报
回复
FBM的算法可以解决问题
Iamyun8 2003-03-05
  • 打赏
  • 举报
回复
0001 1111 1111 ->20
0000 1111 1111 ->19

==> 1111 1111 1111 ->23
==> 0111 1111 1111 ->22
==> 0000 0000 0011 ->13
==> 0000 0000 0001 ->12

恩,如果题目里面没写10/9点,用我的方法就不错,0-11是12-23的反码,使用很方便的说


自相矛盾吧。哈哈。
0756terryzeng 2003-03-05
  • 打赏
  • 举报
回复
好问题!!!我要好好研究研究......
kurapika 2003-03-04
  • 打赏
  • 举报
回复
我觉得是相应的时间点是在相应的位置上用0表示,其他位都是1
ccck1111 2003-03-03
  • 打赏
  • 举报
回复
关注中////////////
liuty2006 2003-02-28
  • 打赏
  • 举报
回复
mark
myblind 2003-02-25
  • 打赏
  • 举报
回复
哦,明白
是用第几位表示 第几小时的啊,算法应该不难吧。
Kevin_qing 2003-02-24
  • 打赏
  • 举报
回复
base+offset
liuty2006 2003-02-20
  • 打赏
  • 举报
回复
mark
wwwsq 2003-02-19
  • 打赏
  • 举报
回复
12bit应该足够记录秒数了吧?就记录秒数好了。上位记起点秒数,下位记终点秒数。
Panr 2003-02-18
  • 打赏
  • 举报
回复
#define LoopShiftToRight(dwTemp) \
dwTemp = 0x1==dwTemp ? 0x800000 : dwTemp >> 1;

#include "math.h"
DWORD GetMask_MostLeftAsOne (ULONG nShiftTimes)
{
int nTemp = nShiftTimes%24;
DWORD dwRet = 1;


#ifdef _INC_MATH
return (DWORD)pow(2.0, (double)nTemp);
#endif//_INC_MATH

while (--nTemp > 0)
LoopShiftToLeft(dwRet);

LoopShiftToRight(dwRet);
return dwRet;
}

DWORD GetMask_MostLeftAsZero (ULONG nShiftTimes)
{
return GetMask_MostLeftAsOne(nShiftTimes - 1);
}

CString GetPeriodCodeStr (DWORD dwPeriodCode)
{
TCHAR tszBuffer[100] = {_T('\0'),};
for (int nIndex=0; nIndex<24; nIndex++)
{
// we want GetMask_MostLeftAsOne
DWORD dwMask = GetMask_MostLeftAsZero(24-nIndex);
int nOffset = nIndex + nIndex/4;
if (dwPeriodCode & dwMask)
tszBuffer[nOffset] = _T('1');
else
tszBuffer[nOffset] = _T('0');
}

CString strRet = tszBuffer;
strRet.Format
(
_T("%4s %4s*%4s %4s*%4s %4s")
, tszBuffer+ 0, tszBuffer+ 5
, tszBuffer+10, tszBuffer+15
, tszBuffer+20, tszBuffer+25
);
return strRet;
}

Panr 2003-02-18
  • 打赏
  • 举报
回复
//
// Panr 2003-02-18 11-07
//
// the key is :
// HOW TO SPECIFY FISRT BIT OF THE PERIOD
// see BuildPeriodCode()
//
#define LoopShiftToLeft(dwTemp) \
dwTemp = 0x800000==dwTemp ? 0x1 : dwTemp << 1;
#define LoopShiftToRight(dwTemp) \

//#include "math.h"
DWORD GetMask_MostLeftAsOne (ULONG nShiftTimes)
{
int nTemp = nShiftTimes%24;
DWORD dwRet = 1;


#ifdef _INC_MATH
return (DWORD)pow(2.0, (double)nTemp);
#endif//_INC_MATH

while (--nTemp > 0)
LoopShiftToLeft(dwRet);

LoopShiftToRight(dwRet);
return dwRet;
}

DWORD GetMask_MostLeftAsZero (ULONG nShiftTimes)
{
return GetMask_MostLeftAsOne(nShiftTimes - 1);
}

CString GetPeriodCodeStr (DWORD dwPeriodCode)
{
TCHAR tszBuffer[100] = {_T('\0'),};
for (int nIndex=0; nIndex<24; nIndex++)
{
// we want GetMask_MostLeftAsOne
if (dwPeriodCode & GetMask_MostLeftAsZero(24-nIndex))
tszBuffer[nIndex + nIndex/4] = _T('1');
else
tszBuffer[nIndex + nIndex/4] = _T('0');
}

CString strRet = tszBuffer;
strRet.Format
(
_T("%4s %4s*%4s %4s*%4s %4s")
, tszBuffer+ 0, tszBuffer+ 5
, tszBuffer+10, tszBuffer+15
, tszBuffer+20, tszBuffer+25
);
return strRet;
}

bool BuildPeriodCode
(
ULONG nClockHead, ULONG nClockTail
, DWORD &dwPeriodCode
)
{
dwPeriodCode = -1;

DWORD dwMaskTemp;
int nLengthPeriod;


// set dwMaskTemp to be the first bit base on nClockHead
dwMaskTemp = GetMask_MostLeftAsZero (nClockHead);
if (nClockHead%24 > nClockTail%24)
{
// if wee hours is in Period,
// we add two hours offset additional.
LoopShiftToLeft(dwMaskTemp);
LoopShiftToLeft(dwMaskTemp);
}
TRACE1(_T("\r\n\r\n$FISRT BIT is : %s"), GetPeriodCodeStr(dwMaskTemp));


// get the nLengthPeriod and modify the dwPeriodCode
nLengthPeriod = nClockTail - nClockHead;
if (nLengthPeriod<=0 || nLengthPeriod>=24)
return false;
while (--nLengthPeriod >= 0)
{
dwPeriodCode ^= dwMaskTemp;
LoopShiftToLeft(dwMaskTemp);
}

dwPeriodCode = dwPeriodCode & 0xFFFFFF;
TRACE3(_T("\r\nFROM %2d TO %2d : %s"), nClockHead, nClockTail, GetPeriodCodeStr(dwPeriodCode));
return true;
}

void CTestDlg::OnButton1()
{
DWORD dwCode;
BuildPeriodCode (10, 20, dwCode);
BuildPeriodCode (19, 24+9, dwCode);
}
oJDI 2003-02-18
  • 打赏
  • 举报
回复
厉害阿,连程序都编出来了.
我的想法就像小学生来数数:这儿是24位,每位都代表它的时钟数:
24-21 20-17 16-13 12-9 8-5 4-1
1111 1000 0000 0001 1111 1111 --> 10-20
而不在同一天的话,那就是两天的事咯,那么就+2吧
19-9 加上2就是 21-11 就得如下:
24-21 20-17 16-13 12-9 8-5 4-1
0000 1111 1111 1100 0000 0000 --> 19-9
是不是有小学生用手指数数的感觉?
投机取巧,让大家笑话了!
wshcdr 2003-02-17
  • 打赏
  • 举报
回复
觉得问题自己有矛盾的地方

但是还是看懂了
eggaig 2003-02-16
  • 打赏
  • 举报
回复
0是相差的时间数

以第二种为基准,以23为模
23-19 = 4
高位加上4个0
相差14小时后面加上12个0中间补1


在同一天里的情况 ,去反就可以了
LeighSwordnet 2003-02-15
  • 打赏
  • 举报
回复
“注意,包含未期待的符号”
商海连横 2003-02-15
  • 打赏
  • 举报
回复
mark!
功名半纸 2003-02-14
  • 打赏
  • 举报
回复
UP
shitalone 2003-02-14
  • 打赏
  • 举报
回复
up!
加载更多回复(20)

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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