免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: zhuomingliang
打印 上一主题 下一主题

我被面试的两个外企面试题相同之处 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2007-09-05 13:00 |只看该作者

想了半天想不出办法避免使用中间变量,算了投降了

有人能比这个短吗?

<?php
$str="This is a book";
$result='';
$chars = preg_split('/ /', $str);
foreach($chars as $value)
{
    $result = $value . ' ' . $result;
}
print $result;
?>

论坛徽章:
0
22 [报告]
发表于 2007-09-05 14:09 |只看该作者
#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// PHP CODE Highliting for CU by dZ902


<?
$str
= 'quick fox jumps over lazy dog';
$res = '';
$tmp = '';

$i = 0;
while ((
$str[$i] || $str[$i-1]) && $tmp .= $str[$i++]) {
    if (
$str[$i-1] == ' ' || $str[$i-1] == NULL) {
        
$res = $str[$i-1] == NULL ? "$tmp $res" : "$tmp$res";
        
$tmp = '';
    }
}

echo
$res;
?>


没有更短,但是没用任何函数。
如果愿意还可以用三元算子整更短。

像这样

  1. $i = 0;
  2. while (($str[$i] || $str[$i-1]) && $tmp .= $str[$i++])
  3.     ($str[$i-1] == ' ' || $str[$i-1] == NULL) ? (($res = $str[$i-1] == NULL ? "$tmp $res" : "$tmp$res") && $tmp = '') : NULL;
复制代码


三行,但是就很难看咯。

论坛徽章:
0
23 [报告]
发表于 2007-09-05 14:10 |只看该作者
当然把 while 缩在一行,用两行也可以

论坛徽章:
0
24 [报告]
发表于 2007-09-05 14:22 |只看该作者
  1. if (!($i = 0)) { while (($str[$i] || $str[$i-1]) && $tmp .= $str[$i++]) { ($str[$i-1] == ' ' || $str[$i-1] == NULL) ? (($res = $str[$i-1] == NULL ? "$tmp $res" : "$tmp$res") && $tmp = '') : NULL; } }
复制代码


Perl-like 的单行程序
也没有用函数

论坛徽章:
0
25 [报告]
发表于 2007-09-05 14:39 |只看该作者
这贴不错,学到了点东西,支持ing

论坛徽章:
0
26 [报告]
发表于 2007-09-05 15:52 |只看该作者
dz902 你那个思路挺好,不过会产生下标越界问题:

Notice: Uninitialized string offset: 29 in D:\usr\www\localhost\public_html\a.php on line ...

论坛徽章:
0
27 [报告]
发表于 2007-09-05 15:56 |只看该作者
帖个c移值版,连字符串运算符都没用:


  1. <?php
  2. $str = "This is a book";
  3. $p = 0;
  4. $start = 0;
  5. $end = 0;
  6. $i = 0;
  7. $src = 0;
  8. do   
  9. {
  10.     if(@($str[$p]==' ')||   @($str[$p]==',')||   @($str[$p]=='.')||   @($str[$p]==';')||   @($str[$p]=='!')|| !isset($str[$p]) )   
  11.     {
  12.         $i = 1;
  13.         $end = $p - 1;   
  14.         $cnt = 0;
  15.         while($start < $end)
  16.         {
  17.             $e = $str[$start];
  18.             $str[$start++] = $str[$end];
  19.             $str[$end--] = $e;
  20.             $cnt++;
  21.         }
  22.     }
  23.     if($i){
  24.         $start=$p+1;
  25.         $i=0;
  26.     }

  27. }while(isset($str[$p++]));

  28. $end += $cnt;

  29. while($src   <   $end)
  30. {
  31.    $e = $str[$src];
  32.    $str[$src++] = $str[$end];
  33.    $str[$end--] = $e;
  34. }
  35. print $str;
  36. ?>
复制代码

论坛徽章:
0
28 [报告]
发表于 2007-09-05 17:19 |只看该作者
看到过最后一题,思路是“先整句翻转,再逐词翻转”

论坛徽章:
0
29 [报告]
发表于 2007-09-05 17:22 |只看该作者
原帖由 sunnyfun 于 2007-9-5 17:52 发表
dz902 你那个思路挺好,不过会产生下标越界问题:



为了少打几个字没用 isset,用 isset 就 OK 了

不用字符运算符也不难……把它换成 "$str $append" 就可以了
下面是修正版,全是 isset 应该不会有 notice 了
修正了前面一个小 bug,有一个多余的空格。

当然,也没有用字符运算符。

#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// PHP CODE Highliting for CU by dZ902


<?php
$str
= 'quick fox jumps over lazy dog';
$res = '';
$tmp = '';

$i = $first = 0;
while ((isset(
$str[$i]) || isset($str[$i-1])) &&
       (
$tmp = (isset($str[$i]) && $str[$i] == ' ') ? $tmp : "{$tmp}{$str[$i]}")) {
    ++
$i;
    if ((isset(
$str[$i-1]) && $str[$i-1] == ' ') || !isset($str[$i-1])) {
        (
$first == 0) ? (($first = 1) && $res = $tmp) : $res = "$tmp $res";
        
$tmp = '';
    }
}

var_dump($res);
?>


当然你要全写在一行也是 OK 的:

  1. if (!($i = $first = 0)) { while ((isset($str[$i]) || isset($str[$i-1])) && ($tmp = (isset($str[$i]) && $str[$i] == ' ') ? $tmp : "{$tmp}{$str[$i]}")) { ++$i; if ((isset($str[$i-1]) && $str[$i-1] == ' ') || !isset($str[$i-1])) { ($first == 0) ? (($first = 1) && $res = $tmp) : $res = "$tmp $res"; $tmp = ''; } } }
复制代码


论坛徽章:
0
30 [报告]
发表于 2007-09-05 19:06 |只看该作者
原帖由 james.liu 于 2007-9-5 10:37 发表
呵呵,,这样的题目,,,我会写


垃圾题,over。

同意
PS:不会做的都是垃圾题!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP