问题陈述如下:
我们称之为“MysteryCode”的一种特殊编码是一种二进制编码系统,其中两个连续值恰好相差一位,即连续实体之间的汉明距离为1.这种编码是通常用于数字通信系统以进行纠错。
LetMysteryCodes(N)表示N比特的MysteryCode列表。
MysteryCodes(1)= 0,1(按顺序排列1-bitcodes列表)
MysteryCodes(2)= 00,01,11,10(按顺序排列的2-bitcodes列表)
MysteryCodes(3)= 000,001,011,010,110,111,101,100(3-bitcodes列表,按此顺序)
存在一种技术,通过该技术可以从(N) - 比特生成(N + 1)个bitcode的列表。
以上步骤的演示:从2-BitMysteryCodes生成3-bitMysteryCodes列表
2位代码列表:00,01,11,10
反向/反映以上列表:10,11,01
使用0:000,001,011,010前缀旧条目
你的任务
你的任务是从神秘码列表中显示N位的最后N个“神秘码”。如果可能,尝试确定以更有效的方式生成此列表的方式,而不是迭代上述所有生成步骤。 更高效或优化的解决方案将获得更高的信誉。
输入格式
单个整数N.
输出格式
N行,每行有二进制数N位。这些是N比特的MysteryCodes列表中的最后N个元素。
输入约束1 = N = 65
示例输入1 1
示例输出1 1
样本1的说明 由于N = 1,这是1比特长度的MysteryCodes列表中的(一个)最后一个元素。
示例输入2 2
示例输出2 11 10
样本2的说明由于N = 2,因此这些是2位长度的MysteryCodes列表中的最后两个元素。
示例输入3 3
示例输出3 111 101 100
$listN = 25;
$bits = array('0','1');
//check if input is valid or not
if(!is_int($listN))
{
echo "Input must be numeric!";
}
if($listN >= 1 && $listN <=65){
if($listN == 1){
echo '1'; exit;
}
ini_set('memory_limit', -1);
for($i=1; $i<=($listN - 1); $i++){
$reverseBits = array_reverse($bits);
$prefixBit = preg_filter('/^/', '0', $bits);
$prefixReverseBits = preg_filter('/^/', '1', $reverseBits);
$bits = array_merge($prefixBit, $prefixReverseBits);
unset($prefixBit, $prefixReverseBits, $reverseBits);
}
$finalBits = array_slice($bits, -$listN);
foreach($finalBits as $k=>$v){
echo $v."\n";
}
}
else{
echo "Invalid input!";
}
我已经尝试过上面的解决方案,但是对于大于20的输入没有用。 例如。如果输入是21,我得到“无法分配内存”错误。
如果有人想出优化的解决方案,那将会很棒......
答案 0 :(得分:3)
数字遵循我转换为代码的模式。 说给定的数字是N. 然后创建一个N×N矩阵并用1&#39;填充它的第一列 以及所有其他具有0的单元格 从最右边的列开始,直到第二列。
对于任何列X,从最底部的行和填充值开始,如下所示:
通过连接每行中的值来打印N x N矩阵。
<?php
$listN = 3;
$output = [];
for ($i = 0; $i < $listN; $i++) {
$output[$i] = [];
for ($j = 0; $j < $listN; $j++) {
$output[$i][$j] = 0;
}
}
$output[$listN - 1][0] = 1;
for ($column = 1; $column < $listN; $column++) {
$zeroFlag = false;
for ($row = $listN - 1; $row >= 0;) {
$oneZero = 1;
if (!$zeroFlag) {
for ($k = 1; $k <= pow(2, $column) / 2 && $row >= 0; $k++) {
$output[$row][$listN - $column] = 0;
$row--;
$zeroFlag = true;
}
}
for ($k = 1; $k <= pow(2, $column) && $row >= 0; $k++) {
$output[$row][$listN - $column] = $oneZero;
$row--;
}
$oneZero = 0;
for ($k = 1; $k <= pow(2, $column) && $row >= 0; $k++) {
$output[$row][$listN - $column] = $oneZero;
$row--;
}
}
}
for ($i = 0; $i < $listN; $i++) {
$output[$i][0] = 1;
}
for ($i = 0; $i < $listN; $i++) {
print(join('', $output[$i]));
print("\n");
}