首頁 > PHP > 一個考題 , 用一個迴圈印出下列結果

一個考題 , 用一個迴圈印出下列結果

2009年10月26日 發表評論 閱讀評論

之前有一家公司出的考題 , 用一個迴圈寫出下列結果

*
**
***
****
*****
******
*****
****
***
**
*

我原本是這麼寫的

1
2
3
4
for($i=1; $i<12; $i++) {
    $n = ($i<6) ? $i:(12-$i);
    echo str_repeat('*' , $n) . "\n";
}

當初這麼個寫法雖然可以跑 , 但沒有仔細考慮到效能問題 , 後來想到應該這麼寫可以更好

1
2
3
for($i=-5 ; $i<6 ; $i++ ) {
    echo str_repeat('*' , 6 - abs($i)) . "\n";
}

當然還有個作弊的方式可以寫出效能更好的 , 就是直接查表法 …

我自己寫了個效能測試來看看每一種的速度 , 程式碼如下

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php
 
function test1() {
	$s = '';
	for($i=1; $i<12; $i++) {
		$n = ($i<6) ? $i:(12-$i);
		$s .= str_repeat('*' , $n) . "\n";
	}
	return $s;
}
 
function test2() {
	$s = '';
	for($i=-5 ; $i<6 ; $i++ ) {
		$s .= str_repeat('*' , 6 - abs($i)) . "\n";
	}
	return $s;
}
 
function test3() {
	static $a = array(
		"*\n" ,
		"**\n" ,
		"***\n" ,
		"****\n" ,
		"*****\n" ,
		"******\n" ,
		"*****\n" ,
		"****\n" ,
		"***\n" ,
		"**\n" ,
		"*\n" ,
	);
	$s = '';
	for($i=0; $i<11; $i++) {
		$s .= $a[$i];
	}
	return $s;
}
 
function performance( $func ) {
	$start_time = microtime(true);
	for($i=0; $i<1000; $i++) {
		$func();
	}
	$ret = $func();
	printf("func %s time: %f ,result : \n%s\n\n", $func , microtime(true) - $start_time ,$ret);
}
performance( 'test1' );
performance( 'test2' );
performance( 'test3' );
?>

輸出結果如下

func test1 time: 0.391411 ,result :
*
**
***
****
*****
******
*****
****
***
**
*

func test2 time: 0.250726 ,result :
*
**
***
****
*****
******
*****
****
***
**
*

func test3 time: 0.201759 ,result :
*
**
***
****
*****
******
*****
****
***
**
*

哈…作弊法雖然是作弊很呆的作法 , 但有時候真的很好用 , 我會不會太處女座了 … 去測試這些幹嘛

Categories: PHP Tags:
  1. johnpupu
    2009年10月26日17:45 | #1

    我也有遇過類似考題
    不過他是要菱形的
    當初忘了 考慮空格
    寫出來的結果就是你的考題..

  2. 2009年10月26日18:21 | #2

    johnpupu :

    我也有遇過類似考題
    不過他是要菱形的
    當初忘了 考慮空格
    寫出來的結果就是你的考題..

    如果用一個迴圈作菱形有點高難度耶
    有沒有 code 可以參考一下

  3. shiang
    2010年3月19日01:15 | #3

    @pigo
    str_pad可以做居中的功能~
    http://php.net/manual/en/function.str-pad.php
    前一陣子我也有玩過排列*的練習(初學者必玩)
    我無聊到用全形*來做…結果發現全形的問題很多…
    因為全形不是單字元,所以很多好用函式都不能用了…
    (真是自找麻煩^^b)
    我是TWPUG的Shiang,最近常在TWPUG得到您的幫助,非常感謝~

  4. Rie
    2010年3月19日02:05 | #4

    是說..可以用無腦陣列嗎…XD
    $star_int=array(1,2,3,4,5,6,5,4,3,2,1);
    $star=array(1=>’*',2=>’**’,3=>’***’,4=>’****’,5=>’******’,6=>’******’);
    foreach($star_int as $val)
    {
    echo $satr[$val].";
    }
    真的還挺蠢的….

  5. 2010年3月19日10:01 | #5

    我是TWPUG的Shiang,最近常在TWPUG得到您的幫助,非常感謝~

    喔~ 你也來啦 哈

  6. 2010年3月19日10:03 | #6

    Rie :

    是說..可以用無腦陣列嗎…XD
    $star_int=array(1,2,3,4,5,6,5,4,3,2,1);
    $star=array(1=>’*’,2=>’**’,3=>’***’,4=>’****’,5=>’******’,6=>’******’);
    foreach($star_int as $val)
    {
    echo $satr[$val].”;
    }
    真的還挺蠢的….

    其實查表法常常用到~ 我寫的 big5_func 就用到, 以前的版本用算的 , 挺慢的
    也看過有人用查表法取代某些 WIN32 GDI 繪圖指令增加繪圖效能
    有時候最直接的方法最好

  7. 2010年3月19日12:05 | #7

    效能差了點~不過這是沒有迴圈版 XD
    echo implode("\r\n", sscanf("************************************","%1s%2s%3s%4s%5s%6s%5s%4s%3s%2s%1s"));

  8. 2010年3月19日12:15 | #8

    小企鵝 :

    效能差了點~不過這是沒有迴圈版 XD
    echo implode(”\r\n”, sscanf(”************************************”,”%1s%2s%3s%4s%5s%6s%5s%4s%3s%2s%1s”));

    wa … sscanf 在 PHP 我從來沒用過說 哈哈