如无特别说明,以下题目均可用各种技术方案来解答。

Posted by & filed under 每日一题.

【四脚猫】每日一题(2014年12月11日): 比方说3对小括号可能的组合有 ()()()、(()())、(())()、()(())、((())) 共有5种,那么4对小括号的组合有几种? n对小括号的又有几种呢?

参考答案:

lazi 采用计算机算法,解题思路:仔细观察最小单元为(),每次从空字符开始,最小单元为(),对字符串进行琢位插入(),去重得到结果。这个想法很宝贵,就算我们不懂什么数学原理依然能解决这个问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
/**
这次应该对了
()
(()) ()()
(())() ((())) ()()() (())() ()(())
*/


function combination($n){

$char = '()';

$result = array('');
$k=0;
for($i=1; $i<=$n; $i++){
$result = insert($result, $char);
}
return $result;
}

function insert($arr, $char){
$result = array();
foreach($arr as $val){
for($i=0; $i<strlen($val)+1; $i++){
$str = substr($val,0,$i).$char.substr($val,$i,strlen($val)-$i);
if(!in_array($str, $result)){
$result[] = $str;
}
}
}
return $result;
}

print_r(combination($_GET['n']));

动心的五月天说自己 脑子直接瓦塔掉了牙!

他提供了计算n对括号组合个数的数学公式算法

1
2
3
4
5
6
7
8
9
10
11
12
function count_pop($n) {
#如果只有一个或0个元素,则出栈序列只有一种
if ($n <= 1) return 1;
$sum = 0;
for ($i = 0; $i < $n; $i++) {
$sum += count_pop($i) * count_pop($n - 1 - $i);
}

return $sum;
}

echo count_pop(5);

吴璟 提供了这个数学解法的参考资料
http://zh.wikipedia.org/wiki/%E5%8D%A1%E5%A1%94%E5%85%B0%E6%95%B0

Posted by & filed under 每日一题.

【四脚猫】每日一题(2014年12月10日):md5这种方法都是哈希成一个字符+数字的字符串,但是现在我们需要把一个字符串哈希成10进制数字,有没有什么算法可以实现的,当然算法速度越快越好!

参考答案:

Diven 提供的方法,比较通用,适合各种字符串,问题在于生成的10进制数据太大了,因为md5的结果是128bit的,php语言本身无法直接保存这么大的十进制数。

1
base_convert(md5($str),16,10); //把md5后的16进制数转成10进制数?

黄莉莉 提供的建议是用 crc32这个函数, 这个函数主要用来做校验的,重复概率很高,我们可以试试如下的数据

CRC重复:htpqwklvynl=pojqhnulnxu
CRC重复:rcoadjtslsa=gcpshlifrsp
CRC重复:hydybfnyrpt=vtcdkivpjyt
CRC重复:cmudwvdvmnb=svurvjgsmog

其实本题就是考察大家的hash算法,目前这类问题也不需要我们研究了,我们可以去参考sdbmhash、jshash、DEKHash…等众多的hash算法。如下就是用PHP实现的SDBHash算法,供大家参考

1
2
3
4
5
6
7
8
function SDBMHash($str){
    $hash = 0 ;
    $n = strlen($str);
    for ($i = 0; $i <$n; $i++){
        $hash = ord($str[$i]) + ($hash <<6 ) + ($hash <<16 ) - $hash;
    }
    return $hash % 701819;
}

Posted by & filed under 每日一题.

【四脚猫】每日一题(2014年12月09日): 以下JS表达式的运行结果是? 为什么?

1
2
3
4
var a=111111111111111110000;
b=111;

console.log(a+b);

以下是动心的五月天提供的参考答案:
js的Number精度明显达不到你的要求,不能实现 。
var a=111111111111111110000;
b=111;
console.log(a+b);
运算结果精确到15位111111111111110000000+111 = 111111111111111110000

Posted by & filed under 每日一题.

【四脚猫】每日一题(2014年12月08日):一个学习linux脚本的同学,写出了如下代码,总出错,你能发现其中的玄机吗?错在哪里?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash
# 此脚本用于批量新增账号,新增账号存放于纯文本文件中,文件名以参数形式传入
# 一行一个账号名,密码与账号相同,强制设定第一次登录后修改密码
if [ $# != 1 ]; then
        echo "必须输入账号文件"
        exit 1
fi
if [ ! -f $1 ]; then
        echo "账号文件不存在"
        exit 1
fi
cat $1
usernames = $( cat $1 )      
for username in $usernames
do
        useradd $username
        echo $username | passwd --stdin $username
        chage -d 0 $username
done
 
脚本使用方法./脚本名 账号文件

账号文件必须已存在,且一行一个字符串表示用户名

参考答案:

细心的同学就能发现,这个代码错在约13行的位置。

1
usernames=$( cat $1 )

这个不能有空格符,shell语法是比较严格的

Posted by & filed under 每日一题.

【四脚猫】每日一题(2014年12月05日): 我们知道,计算机是基于二进制的,后来为了表达数据的方便,我们常常使用16进制,那么如何实现任意进制的数据互相转换呢,比方说 32 进制的字母表依次是:
[0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v]

那么我们如何编写算法,把一个已知的十进制数转为32进制呢?

比方说 convert32(5000) ,结果应该是 4s8
convert32(6000) ,结果应该是 5rg

那么这个convert32 函数如何来实现?

参考答案:
以下是 Diven 提供的解法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function convert32($oNum)
{
$base = array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g',
'h','i','j','k','l','m','n','o','p','q','r','s','t','u','v');
$arr = array();
$arr[0] = $oNum%32;
while ($oNum = floor($oNum/32)) {
$arr[] = $oNum%32;
}
krsort($arr);
$num = '';
foreach ($arr as $v) {
$num .= $base[$v];
}
return $num;
}

var_dump(convert32(6000));
var_dump(convert32(5000));

Posted by & filed under 每日一题.

【四脚猫】每日一题(12月04日):以下JS代码运行的结果是什么? 为什么?

1
2
3
4
5
6
7
var foo='hello';

(function(){
var foo=foo||'world' ;
console.log(foo);

})();

参考答案:

网友“如果当時。פ”给出的答案很好。

输出world,在函数里面,用var声明的变量会有一个提升的机制,以上代码等价于:

1
2
3
4
5
6
var foo='hello';
(function(){
var foo;
foo=foo||'world' ;
console.log(foo);
})();

Posted by & filed under 每日一题.

【四脚猫】每日一题(12月03日): in_array(’01’,array(‘1′))为什么返回true ?

参考答案:

以下是里海很近给出的答案:

这个问题和’==’与’===’的问题是同一个,前者是弱比较,会以等号后的变量为基础对等号前变量进行转换再比较,而后者不会,要比较各自和类型。如果要想强比较,请使用 in_array(’01′,array(’1′),true)

Posted by & filed under 每日一题.

【四脚猫】每日一题(12月02日):在一堆数字中找出和其他数字不同的数字,如123,123,14,123,123,123这堆数字中找出14来,写下算法思路和时间复杂度。

参考答案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
/*
读取前3个数字:
1. 如果3个数字不都一样,给出不一样的那个,结束。
2. 如果都一样=X,整个数组扫过去,找到一个不等于X的数字,结束。
*/


function  uniqNum($nums){
    $n=count($nums);
    $a = $nums[0]; $b = $nums[1];$c = $nums[2];
    if ($a == $b && $b == $c)
        for ($i = 3; $i < $n; $i++)
            if ($x[$i] != $a){
            return $x[$i];
            }
    if ($a == $b) return $c;
    if ($a == $c) return $b;
    return $a;
}

echo uniqNum( [ 123,123,14,123,123,123 ] );

Posted by & filed under 每日一题.

【四脚猫】每日一题(11月28日): 领导交代了一个很简单的事情 从200.200.200.200 到244.244.244.244 的所有ip 用http协议请求下并拿到所有返回值为200 的ip , 目前公司有现成的http请求的函数 httpopen(), 只需要循环取到ip地址,这段代码该怎么写?

Posted by & filed under 每日一题.

【四脚猫】每日一题(11月27日):页面上有两个输入框,name 分别是num1 和 num2 , 可以输入任意长度的整数 , 后台需要计算两个参数的和,php代码该怎么写

参考答案: 本题主要考察点在于 任意长度的整数相加, 用int等类型会溢出,解决的办法是分而治之, 将num1和num2 以字符串接受,然后将其拆分成数组,分别相加后处理 , 例如 1234567890000000 和 3243320000000000 可以分别拆成
array(“1234″,”5678″,”9000″,”0000″) , array(“3243″,”3200″,”0000″,”0000″)

他们分别相加即(1234+3243) , 5678+3243 , 9000+0000, 0000+0000 ,算出结果后将其拼在一起(需要注意进位)