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

Posted by & filed under 技术干货.

20121003090519401[1]结论:三种模式下,虚拟系统和宿主机器系统都是可以互相联通的。

桥接模式: 虚拟出来的操作系统就像是局域网中的一台独立的主机(主机和虚拟机处于对等地位)

NAT模式 :虚拟系统需要借助NAT(网络地址转换)功能,通过宿主机器所在的网络来访问公网。也就是说,使用NAT模式虚拟系统可把物理主机作为路由器访问互联网。
(虚拟机系统可以上网)

主机模式:主机模式下,真实环境和虚拟环境是隔离开的;在这种模式下,所有的虚拟系统是可以相互通信的,但虚拟系统和真实的网络是被隔离开。(虚拟系统和宿主机器系统是可以相互通信的,相当于这两台机器通过双绞线互连。)

主机模式适合做网络实验,因为虚拟机不和外界网络有交流,没外界干扰。但是虚拟机系统默认情况下不能上网的,除非特殊搞路由配置。
另外,主机模式下,windows的防火墙要关闭,虚拟机ping不通主机。

Posted by & filed under 每日一题.

【四脚猫】每日一题(2015年04月14日):编写一个方法,数出从0到n中数字2出现了几次?
例如:如果n为20,那么0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 中共2共出现了3次。

day提供的解法,经典的思路,这个也叫做蛮力法

1
2
3
4
5
6
7
8
function countTwo($start, $end){
$c = 0;
for($i=$start; $i<=$end; $i++){
$c += substr_count($i, '2');
}
return $c;
}
echo( countTwo(0, 20) );

青菜虫提供的解法,充分利用了字符串的相关函数,数字太大的时候要小心用这个哦

1
echo substr_count( implode('', range(0, $n)), '2' );

Beta给个非字符串解法(奥数题解法):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function countNumber($n, $digit) {
$power = 1; //10为底的幂,代表当前计数的位
$count = 0;
while($power <= $n) {
$r = $n % (10 * $power); //$r 为 $n 不断十进制右移移除的数字组合的数值
$m = ($n-$r)/(10 * $power);//$m 为 $n 不断十进制右移后的值
$currentDigit = intval($r / $power);
if($currentDigit < $digit) {
$count += $m * $power;
} elseif($currentDigit > $digit) {
$count += ($m + 1) * $power;
} else {
$count += ($m + 1) * ($r % $power + 1);
}
$power *= 10;
}
return $count;
}

Posted by & filed under 每日一题.

【四脚猫】每日一题(2015年04月13日):在其他语言里面有一个startsWith 函数,举个例子:

1
2
3
4
5
$str = '|apples}';

echo startsWith($str, '|'); //返回 true
echo startsWith($str, '|ap'); //返回 true
echo startsWith($str, 'ap'); //返回 false

如何用PHP来实现这个函数呢?

本题虽然简单,但是不少人都用了多此一举的if,详细看评论区。
参考答案:

1
2
3
4
5
6
7
8
9
10
11
12
<?php

 
function startsWith($haystack, $needle) {
    return $needle === "" || strpos($haystack, $needle) === 0;
}
 
var_dump( startsWith(" ", "ab") );
var_dump( startsWith("abcdef", "abc") );
var_dump( startsWith("abcdef", "ef") );
var_dump( startsWith("abcdef", "") );
var_dump( startsWith("", "abcdef") );

Posted by & filed under 每日一题.

【四脚猫】每日一题(2015年04月09日):有一组数 100,20,90,40,10,50,70,88,25.6 , 16 ,请用最简洁的方法找出两个数之差最大和两个数之差最小的两组数据。

本题解题思想:
排序必然是第一步,排完序之后,数组两端的基本就是相差最大的一组数据。
而相差最小的,就要把相邻的两个数组依次去相减,最后找到结果最小的一组即是答案。
本题虽然不难,但是非常考验算法功底,我们一起来看下各路大神的精彩解法吧:

PS:田小成是一个非常机智的小伙 :) 看评论就知道了

刘建勋采用array_slice、array_map和 array_splice 提供了一种非常巧妙的解法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php

$items_date = [100,20,90,40,10,50,70,88,25.6,16];
rsort($items_date);
$right_items = array_slice($items_date,0,-1);
$left_items = array_slice($items_date,1);

//计算两两差值,返回最小差值key
$diff_items = array_map(function($a,$b){
return $a - $b;
},$right_items,$left_items);

$keys = array_keys($diff_items,min($diff_items));//得出最小差值KEY
//最终得出两个数之差最小的两组数据为
$min_items[0] = $right_items[$keys[0]];
$min_items [1] = $left_items[$keys[0]];
print_r($min_items);//最小
 

//最终得出两个数之差最大的两组数据为
array_splice($items_date,1, -1);
print_r($items_date);//最大

千里不亏是算法功底深厚的高手,计算最小差值的代码非常简洁!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function getHighLow($ary){
    if(!is_array($ary) || empty($ary)) return false;
    sort($ary);
    $total = count($ary);
    $new_arr = array();
    for($i=1;$i<$total;$i++){
        $new_arr[$i] = $ary[$i] - $ary[$i-1];
    }
    asort($new_arr);
    $ary_key = array_keys($new_arr);
    $low_key = current($ary_key);
    return array(
        'low' => array($ary[$low_key],$ary[$low_key-1]),
        'high' => array($ary[0],$ary[$total-1])
    );
}

看谁的长为了计算最小差值,采用了独特的一种思路,看来是数学高手!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
   
$nList = [100,20,90,40,10,50,70,88,25.6 , 16];
sort($nList);
$list = [];
$min = $nList[count($nList) - 1];
$str = '';
for ($i=0; $i < count($nList); $i++) {
    for ($j=count($nList) - 1; $j >= 0; $j--) {
        if($nList[$i] < $nList[$j]) {
            if($nList[$j] - $nList[$i] < $min) {
                $min = $nList[$j] - $nList[$i];
                $str = "$nList[$j] , $nList[$i]";
            }
        }
    }
}
$list['相差最小的'] = $str;
$list['相差最大的'] = $nList[count($nList) - 1] . ',' . $nList[0];

Diven思想果然更进一步,代码简洁,而且考虑到多种可能!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
   
/**
* 这里应该要注意相差最小的组合可能有多个
* @param array $arr
* @return array
*/

function findDiff($arr){
    sort($arr);
    $brr = $arr;
    $return['max'] = array(array_shift($arr), array_pop($brr));
    $diff = array_map(function ($a, $b) {return $a-$b;}, $arr, $brr);
    $keys = array_keys($diff, min($diff));
    foreach ($keys as $k) {
        $return['min'][] = array($arr[$k], $brr[$k]);
    }
    return $return;
}

$arr = array(100, 20, 90, 40, 10, 50, 70, 88, 25.6, 16);
print_r(findDiff($arr));

Posted by & filed under 每日一题.

【四脚猫】每日一题(2015年04月07日): 一个村子里有50户人家,每户人家养一条狗,不幸的是村子里的有狗感染了疯狗病,现在要杀死疯狗。
杀狗规则如下:
(1)必须确定是疯狗才能杀
(2)杀狗用猎枪,开枪杀狗人人都听的见,没聋子.
(3)只能观察其他人家的狗是否得了疯狗病,不能观察自己的狗是否有疯狗病
(4)只能杀自己家的狗,别人家的狗你就是知道有疯狗病也不能杀.
(5)任何观察到了其他人家的狗有疯狗病都不能告诉任何人.
每人每天去观察一遍其他人家的狗是否疯狗
现在现象是:第一天没有枪声,第二天没有枪声,第三天响起一片枪声.

问:第三天杀了多少条疯狗?

Posted by & filed under 每日一题.

【四脚猫】每日一题(2015年04月03日):已知一个linux目录下有如下这些文件:

1
2
3
4
5
6
7
ls /home/sjm/imgs
sjm1_20150302_finished.jpg
sjm2_20140202_finished.jpg
sjm3_20140102_finished.jpg
sjm4_20130902_finished.jpg
sjm5_20120602_finished.jpg
...

现在想用一个shell脚本批量来修改这些文件名,把_finished去掉,实现如下效果:

1
2
3
4
5
6
7
ls /home/sjm/imgs
sjm1_20150302.jpg
sjm2_20140202.jpg
sjm3_20140102.jpg
sjm4_20130902.jpg
sjm5_20120602.jpg
...

请问这段shell脚本如何写?