最近在論壇閑逛,先后參與了兩題算法趣味題目。
- 題目1是要求算一任意長(zhǎng)度字符串中不同的字符以及它的個(gè)數(shù)。
- 題目2是把一段字符串用“右起豎排”的古文格式輸出。
題目難度不大,都是針對(duì)字符串的操作,邏輯比較簡(jiǎn)單,靈活在對(duì)不同語(yǔ)言、語(yǔ)法的掌握程度。(原文分別在:1,2。)
看了大家用C++、C#、Java等語(yǔ)言的實(shí)現(xiàn),總感覺(jué)牛刀殺雞太麻煩,有興趣的朋友可以自己寫(xiě)寫(xiě)看或者直接看原文的網(wǎng)友回復(fù)。我最近一段時(shí)間Python寫(xiě)的比較多,讀到這些題目時(shí)候,就有一種躍躍欲試的沖動(dòng)。因?yàn)槲抑烙肞erl,Python,Ruby等動(dòng)態(tài)語(yǔ)言來(lái)做這類題目,會(huì)是非常理想的。后來(lái)我做了這兩道題目,結(jié)果也令人滿意,代碼之簡(jiǎn)潔保持在所有答案的前列。
先看第一題Python解答:
dic = {} for s in "abcdefgabc": dic[s] = 1 if s not in dic else (dic[s]+1) print '\n'.join('%s,%s' % (k, v) for k, v in dic.items())
輸出結(jié)果:
a,2 c,2 b,2 e,1 d,1 g,1 f,1
Python的四行代碼分別做了dictionary的聲明,賦值,字符串的遍歷,以及高效拼接。
如果還沒(méi)有看出它的簡(jiǎn)潔和強(qiáng)大的話,請(qǐng)看第二題的解法:
def main(offset=6):
string = u'靜夜思 李白床前明月光,疑似地上霜。舉頭望明月,低頭思故鄉(xiāng)。090131'
a = [[' ']*offset for row in xrange(offset)]
for i in xrange(offset):
for j in xrange(offset):
a[i][j] = string[j + i*offset]
b = [[r[col] for r in a[::-1]] for col in xrange(len(a[0]))]
print '\n'.join([u'┊'.join(unicode(c) for c in row)for row in b])
輸出結(jié)果:
0┊低┊舉┊疑┊床┊靜
9┊頭┊頭┊似┊前┊夜
0┊思┊望┊地┊明┊思
1┊故┊明┊上┊月┊
3┊鄉(xiāng)┊月┊霜┊光┊李
1┊。┊,┊。┊,┊白
這題如果用C#等實(shí)現(xiàn),代碼要在20行以上。下面我簡(jiǎn)單介紹一下這幾行代碼:
- 第3行,在Python里面二維“數(shù)組”通過(guò)嵌套list來(lái)實(shí)現(xiàn),這里初始化一個(gè)6行6列的二維數(shù)組;
- 第7行,我們把“矩陣”順時(shí)針旋轉(zhuǎn)了90度(行列置換,并且對(duì)置換后的行首尾對(duì)調(diào)-這里的::-1就是用來(lái)置換一個(gè)list的trick);
- 最后一行,我們把數(shù)組里的每行中元素,每行之間分別用兩個(gè)不同字符拼接起來(lái)。join方法以及for..in..語(yǔ)句在python中是相當(dāng)常見(jiàn)的用法。
通過(guò)這兩題,我們看到Python在處理字符串時(shí)候的十分靈活方便,雖然一種語(yǔ)言的好壞不應(yīng)完全靠是否簡(jiǎn)潔來(lái)衡量,但對(duì)于我個(gè)人而言,Python是目前我用過(guò)的最好的語(yǔ)言。而且對(duì)于趣味題來(lái)說(shuō),這不就是我們解題的趣味所在嗎?
Feedback
http://www.cnblogs.com/JeffreyZhao/archive/2009/02/01/1381867.html
第二個(gè)
static void Count(string message) {
message
.GroupBy(c => c)
.ToList()
.ForEach(p => Console.WriteLine("{0}, {1}", p.Key, p.Count()));
}
這樣似乎更爽一些,呵呵
那個(gè)select的確可以省,我是習(xí)慣于先搞出數(shù)據(jù)來(lái),然后添加行為,而不是在行為里繼續(xù)計(jì)算
呵呵,是因?yàn)橄萻elect了好重復(fù)用吧,習(xí)慣問(wèn)題,我的喜歡就根據(jù)題目變化。
#5樓 回復(fù) 引用
2009-02-01 11:59 by young5335 [未注冊(cè)用戶]myset=set(a)
for s in myset:
print(str(a.count(s))+" "+s)
2 a
2 c
2 b
1 e
1 d
1 g
1 f
#6樓 回復(fù) 引用
2009-02-01 13:24 by young5335 [未注冊(cè)用戶]colSize=6
string="靜夜思 李白床前明月光,疑似地上霜。舉頭望明月,低頭思故鄉(xiāng)。0901311"
iLen=math.ceil(len(string)/colSize)
l=list(reversed(([string[i*colSize:i*colSize+colSize].ljust(colSize,' ') for i in range(0,iLen)])))
for i in range(colSize):
for j in range(iLen):
print(l[j][i],end=" ")
print()
python語(yǔ)法我真的快忘光光了.
#7樓 回復(fù) 引用
2009-02-01 13:28 by young5335 [未注冊(cè)用戶]#8樓 回復(fù) 引用
2009-02-01 13:44 by young5335 [未注冊(cè)用戶]$a="abcdefgabc";
$result=count_chars($a,1);
array_walk($result,create_function('$v,$k','echo chr($k)." ".$v."<br/>";'));
a 2
b 2
c 2
d 1
e 1
f 1
g 1
var s = "hello";
var arr = s.split('');
var o = {};
var c;
for (var i = 0; i < arr.length; i++)
{
o[arr[i]] = (o[arr[i]] ? o[arr[i]] : 0) + 1;
}
var result = "";
for (var p in o)
{
result += p + ", " + o[p] + "\r\n";
}
alert(result);
#10樓 回復(fù) 引用
2009-02-02 10:22 by 賴勇浩 [未注冊(cè)用戶]>>> adict = defaultdict(int)
>>> for s in "abcdefgabc":
... adict[s] += 1
...
>>> print '\n'.join('%s,%s' % (k, v) for k, v in adict.iteritems())
a,2
c,2
b,2
e,1
d,1
g,1
f,1
#11樓 回復(fù) 引用
2009-02-02 11:21 by young5335 [未注冊(cè)用戶]b={}
a.each_char { |x|b.store(x,a.count(x)) }
b.each {|k,v| puts k+" "+v.to_s}
#12樓 回復(fù) 引用
2009-02-02 15:18 by hehehe [未注冊(cè)用戶]('abcdefgabc' as List).groupBy{it}.each{k, v -> println "$k, ${v.size()}"}
#13樓 回復(fù) 引用
2009-02-02 15:37 by hehehe [未注冊(cè)用戶]def a = '床前明月光 疑似地上霜 舉頭望明月 低頭思故鄉(xiāng)'.tokenize(' ')
5.times{row ->
println a.collect{it[row]}.reverse().join('|')
}
低|舉|疑|床
頭|頭|似|前
思|望|地|明
故|明|上|月
鄉(xiāng)|月|霜|光
#14樓 回復(fù) 引用
2009-02-02 16:04 by zealtea [未注冊(cè)用戶]offset = 6
a =[i[::-1] for i in zip(*[txt[i:i+offset] for i in range(0, len(txt), offset)])]
for i in a:
print "|".join(i)