问个面试题,有点不明白

愤怒的翅膀 2013-07-01 06:14:46
把一个unsigned char的数按照各位逆序,生成一个数,用最小的时间复杂度算出,强调算法复杂度最小
...全文
346 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
愤怒的翅膀 2013-08-17
  • 打赏
  • 举报
回复
引用 7 楼 dw903632958 的回复:
[quote=引用 5 楼 u010936098 的回复:]
//十进制位:O(1)
unsigned char reserve_dec( unsigned char value )
{
    return (value / 100) + ( value / 10 % 10 * 10 ) + (value % 10 * 100);
}

//十六进制:O(1)
unsigned char reserve_hex( unsigned char value)
{
    return (value << 4) & (value >> 4);
}

//二进制:O(1)
unsigned char reserve_bin( unsigend char value )
{
    static unsigned char rchars[] = "\0\x08\x04\x0c\x02\x0a\x06\x0e\x01\x09\x05\x0d\x03\x0b\x07\x0f";
    return rchars[value >> 4] | ( rchars[value & 0x0F] << 4 );
}
[/quote] 16进制中应该是 ()|()吧
SKATE11 2013-07-02
  • 打赏
  • 举报
回复
#include <windows.h> #include <iostream> using namespace std; unsigned char ucharReversal(unsigned char); int main(void) { int SrcChar; std::cout<<"Input unsigned char number:"; std::cin>>SrcChar; std::cout<<"Reversal number:"<<(int)ucharReversal(SrcChar)<<std::endl; cout<<(int)GetProcessHeap(); return 0; } unsigned char ucharReversal(unsigned char SrcChar) { unsigned char TargetChar = 0; unsigned char ErgodicIndex1 = 0x80; unsigned char ErgodicIndex2 = 0x01; while(ErgodicIndex1) { if(SrcChar & ErgodicIndex1) TargetChar |= ErgodicIndex2; ErgodicIndex1 = ErgodicIndex1 >> 1; ErgodicIndex2 = ErgodicIndex2 << 1; } return TargetChar; }
_胖胖 2013-07-02
  • 打赏
  • 举报
回复
引用 10 楼 L812234929 的回复:
[quote=引用 9 楼 beyourself1989 的回复:] 看不懂二进制的那个。
二进制这个就是生成一个0~0xF 的反序表,比如0001反序之后就是1000,即rchars[1] = 0x8[/quote] 谢谢啊~~这么一说豁然开朗呀~~好人
kier 2013-07-02
  • 打赏
  • 举报
回复
不过既然是,八位的,最快的就是查表了, 1 -> 128 2 -> 64 3 -> 192 ...
kier 2013-07-02
  • 打赏
  • 举报
回复

unsigned char reverse_bit(unsigned char b)
{
    b = (b << 4) + (b >> 4);						// &11110000, 56781234
    b = ((b & 0x33) << 2) + ((b & 0xCC) >> 2);		// &11001100, 78563412
    b = ((b & 0x55) << 1) + ((b & 0xAA) >> 1);		// &10101010, 87654321
    return b;
}
AndyStevens 2013-07-02
  • 打赏
  • 举报
回复
不知可否?
unsigned char getval(unsigned char uc)
{
	if(uc==0)return uc;
	unsigned char rtn = 0;
	for(int i=0;i<8;i++)
	{
		rtn=((rtn+((uc>>i)&1))<<(i<7?1:0));
	}
	return rtn;
}
狼异族 2013-07-02
  • 打赏
  • 举报
回复
引用 9 楼 beyourself1989 的回复:
看不懂二进制的那个。
二进制这个就是生成一个0~0xF 的反序表,比如0001反序之后就是1000,即rchars[1] = 0x8
_胖胖 2013-07-02
  • 打赏
  • 举报
回复
看不懂二进制的那个。
Inhibitory 2013-07-01
  • 打赏
  • 举报
回复
引用 楼主 zhaokang1989 的回复:
把一个unsigned char的数按照各位逆序,生成一个数,用最小的时间复杂度算出,强调算法复杂度最小
这个位是bit的位还是个,十,百的位 ?
就是那个党伟 2013-07-01
  • 打赏
  • 举报
回复
引用 5 楼 u010936098 的回复:
//十进制位:O(1)
unsigned char reserve_dec( unsigned char value )
{
    return (value / 100) + ( value / 10 % 10 * 10 ) + (value % 10 * 100);
}

//十六进制:O(1)
unsigned char reserve_hex( unsigned char value)
{
    return (value << 4) & (value >> 4);
}

//二进制:O(1)
unsigned char reserve_bin( unsigend char value )
{
    static unsigned char rchars[] = "\0\x08\x04\x0c\x02\x0a\x06\x0e\x01\x09\x05\x0d\x03\x0b\x07\x0f";
    return rchars[value >> 4] | ( rchars[value & 0x0F] << 4 );
}
hello_world000 2013-07-01
  • 打赏
  • 举报
回复
查表最快吧...
橡木疙瘩 2013-07-01
  • 打赏
  • 举报
回复
//十进制位:O(1)
unsigned char reserve_dec( unsigned char value )
{
    return (value / 100) + ( value / 10 % 10 * 10 ) + (value % 10 * 100);
}

//十六进制:O(1)
unsigned char reserve_hex( unsigned char value)
{
    return (value << 4) & (value >> 4);
}

//二进制:O(1)
unsigned char reserve_bin( unsigend char value )
{
    static unsigned char rchars[] = "\0\x08\x04\x0c\x02\x0a\x06\x0e\x01\x09\x05\x0d\x03\x0b\x07\x0f";
    return rchars[value >> 4] | ( rchars[value & 0x0F] << 4 );
}
橡木疙瘩 2013-07-01
  • 打赏
  • 举报
回复
//十进制位:O(1) unsigned char reserve_dec( unsigned char value ) { return (value / 100) + ( value / 10 % 10 * 10 ) + (value % 10 * 100); } //十六进制:O(1) unsigned char reserve_hex( unsigned char value) { return (value << 4) & (value >> 4); } //二进制:O(1) unsigned char reserve_bin( unsigend char value ) { static unsigned char rchars[] = "\0\x08\x04\x0c\x02\x0a\x06\x0e\x01\x09\x05\x0d\x03\x0b\x07\x0f"; return rchars[value >> 4] | rchars[value & 0x0F]; }
橡木疙瘩 2013-07-01
  • 打赏
  • 举报
回复
“各位”是什么?十六进制位?十进制位?二进制位?256进制位?
水平不流 2013-07-01
  • 打赏
  • 举报
回复
引用 1 楼 SKATE11 的回复:
直接求余几下就完了啊
你觉得有可能这么简单..
SKATE11 2013-07-01
  • 打赏
  • 举报
回复
直接求余几下就完了啊

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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