刚打算入门学习算法,遇到一题发现 PHP 果然是最好的语音

2018-03-22 13:31:11 +08:00
 qxy

http://www.lintcode.com/en/problem/longest-words/

朋友推荐的网站,但是,只支持 C++,JAVA,PYTHON2/3,因为是刚入门,所以,找了一题应该最简单的。

然而,楼主用的 php,其他不会,所以,自己在本地写了一手。

此题给了提示:

 遍历两次的办法很容易想到,如果只遍历一次你有没有什么好办法?

但是,经我一想哪里需要两次循环。用我大 php 一次循环加个排序不就好了吗。 原数据:

Array
(
    [0] => dddd
    [1] => a
    [2] => eeeee
    [3] => ccc
    [4] => bb
)
最大数:eeeee

渣代码:

<?php

$a = [
    'dddd',
    'a',
    'eeeee',
    'ccc',
    'bb',
];

$arr = [];
foreach ($a as $k => $v) {
    $arr[strlen($v)] = $v;
}

echo '<pre>';
print_r($a);
krsort($arr);
print_r('最大数:' . current($arr));

一直听闻,php 对于数组的处理比其他语言要厉害。难道,果真如此,其他语言,对于这题有啥不同的解法,请赐教!

9448 次点击
所在节点    程序员
96 条回复
LokiSharp
2018-03-22 13:49:50 +08:00
Win7 + Chrome, 代码输入界面没法 Backspace
qxy
2018-03-22 13:55:22 +08:00
@LokiSharp win10 + Chrome 可以。。
jasontse
2018-03-22 13:58:26 +08:00
排序不算循环?
lhx2008
2018-03-22 13:59:23 +08:00
瞎搞。。还调排序,nlogn 了解一下
lizhenda
2018-03-22 14:02:08 +08:00
你调用系统函数算啥···
lhx2008
2018-03-22 14:02:21 +08:00
php 要调排序也是用 uasort 啊,哈哈
zjsxwc
2018-03-22 14:03:43 +08:00
不用排序啊,直接贪心就行

```
$a = [
];
$maxLen = -1;
$result = null;
foreach ($a as $ele) {
if ($maxLen < strlen($ele)) {
$maxLen = strlen($ele);
$result = $ele;
}
}
```
nbndco
2018-03-22 14:04:34 +08:00
感觉这个算法题解的有一些偏差……
Mervyn1205
2018-03-22 14:07:59 +08:00
数组是如下内容的时候,答案是错的
{
"like",
"love",
"hate",
"yes"
}
davinci
2018-03-22 14:12:03 +08:00
太慢了,而且没有考虑多个长度相同的字符串的情况。这题 o(n) 时间复杂度,o(n)空间复杂度,一次循环即可。
yuann72
2018-03-22 14:17:22 +08:00
这样行么?


function longest_words (arr){
let maxLength = 0,
output;
arr.forEach((item) => {
if (maxLength < item.length){
maxLength = item.length;
output = [];
output.push(item);
}else if (maxLength === item.length){
output.push(item);
}
});
return output;
}

longest_words([
"dog",
"google",
"facebook",
"internationalization",
"blabla"
])

longest_words([
"like",
"love",
"hate",
"yes"
])
g00001
2018-03-22 14:19:31 +08:00
一个循环是可以的,
数组排序也不是必须的,排序也是有代价的。
这个题应当是降低了难度,如果从文本中查找,实际上数组也可以省略掉,生成数组也是有消耗的。

longWord = function(s){
var r;
for w in string.lines(s,"\s") if( #w > #r) r = w;
return r;
}

var word = longWord("dddd a eeeee ccc bb");

用 aardio 写的,不生成数组不排序,直接找到最长单词。
LokiSharp
2018-03-22 14:21:53 +08:00
def longestWords(self, dictionary):
# write your code here
max_len = 0
list_ = []
for str_ in dictionary:
str_len = len(str_)
if str_len == max_len:
list_.append(str_)
elif str_len > max_len:
max_len = str_len
list_.clear()
list_.append(str_)

return list_

随手写的= =略丑
ChristopherWu
2018-03-22 14:29:30 +08:00
根本不需要排序。。
遍历给出的 map 一遍,用 map[词的长度] 来存数组, 同时一个变量记录最长单词长度。

直接返回 map[最长单词长度]即可

On 复杂度,估计是最低了。
HypoChen
2018-03-22 14:30:20 +08:00
python:

words = [
"like",
"love",
"hate",
"yes"
]

print(list(filter(lambda x: len(x) == len(sorted(words, key=lambda x: len(x), reverse=True)[0]), words)))
davinci
2018-03-22 14:31:28 +08:00
@g00001 这题要求输出所有长度最长的字符串。你的解法只会输出第一个出现的长度最长的字符串
snowolfy
2018-03-22 14:45:31 +08:00
@HypoChen
没必要 sort 的,@LokiSharp 的办法只需要字符串过一遍
ChristopherWu
2018-03-22 14:46:50 +08:00
``
`class Solution {
public:
/*
* @param dictionary: an array of strings
* @return: an arraylist of strings
*/
vector<string> longestWords(vector<string> &dictionary) {
unordered_map<int, vector<string> > hash;
int longest_len = 0;
for(auto &it : dictionary) {
int len = it.length();
if(len > longest_len)
longest_len = len;
if(hash.find(len) == hash.end()) {
vector<string> v;
v.push_back(it);
hash[len] = v;
}else {
hash[len].push_back(it);
}
}
return hash[longest_len];
}
};
```

过了。。好久没有 写 C++,语法都七零八碎,查来查去。
lxy42
2018-03-22 14:48:40 +08:00
PHP 果然是最好的语言
jmc891205
2018-03-22 14:48:48 +08:00
楼主是来黑 php 的吧 多大仇?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/440404

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX