免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4395 | 回复: 10
打印 上一主题 下一主题

[文本处理] 腾讯面试题 - 字符排序 [复制链接]

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-26 12:53 |只看该作者 |倒序浏览
给大家出道题,用来练练手。
看到这个腾讯面试题 (图片在五楼)http://bbs.chinaunix.net/thread-3772591-1-1.html,其中的 三 (2) 题,可以用shell 做。
http://cupic.img168.net/bbsfile/ ... voho128cz6v2ulv.jpg

echo "abcaba asdfasdf asdfasdfasdf" | command

要的排序结果是

asdfasdfasdf abcaba asdfasdf

大家试试看。

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
2 [报告]
发表于 2012-09-26 13:19 |只看该作者
回复 1# rdcwayx


    是如何排序的?看了链接,说得不是很清楚。

如果现出次数最多的次数相同,那么……?

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
3 [报告]
发表于 2012-09-26 13:29 |只看该作者
@blackold
我的理解是, 将字符拆开后,统计处每个字母出现的次数。 这样的话, asdfasdf 就是最后,因为其最大的重复次数只有2, 其他的是3.
接着,abcaba 和 asdfasdfasdf 都有三个a, 那么在往下比,这样的话,asdfasdfasdf 胜出

abcaba
      3 a
      2 b
      1 c
asdfasdf
      2 a
      2 d
      2 f
      2 s

asdfasdfasdf
      3 a
      3 d
      3 f
      3 s

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
4 [报告]
发表于 2012-09-26 13:40 |只看该作者
回复 1# rdcwayx
  1. echo "abcaba asdfasdf asdfasdfasdf" |awk '{for(line=1;line<=NF;line++)ss[sort_($line)]=$line}
  2. END{for(n=asort(ss);n>=1;n--)print ss[n]}
  3. function sort_(s){delete b_;for(i=1;i<=split(s,a_,"");i++){b_[a_[i]]++};t="";for(m=1;m<=asort(b_);m++)t=t b_[m]; return t+0;}'
  4. asdfasdfasdf
  5. asdfasdf
  6. abcaba
复制代码

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
5 [报告]
发表于 2012-09-26 13:52 |只看该作者
@yinyuemi
好像不对, 要的结果是

asdfasdfasdf
abcaba
asdfasdf

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
6 [报告]
发表于 2012-09-26 14:15 |只看该作者
回复 5# rdcwayx

这样好像可以
  1. echo "abcaba asdfasdf asdfasdfasdf" |awk '{for(line=1;line<=NF;line++){tt[sort_($line)]=$line}}
  2. END{for(n=asorti(tt,ll);n>=1;n--)print tt[ll[n]]}
  3. function sort_(s){delete b_;delete u_;for(i=1;i<=split(s,a_,"");i++){b_[a_[i]]++};t="";for(m=asort(b_);m>=1;m--){ t = t b_[m] }; return t;}'
  4. asdfasdfasdf
  5. abcaba
  6. asdfasdf
复制代码

论坛徽章:
1
辰龙
日期:2014-05-22 11:38:58
7 [报告]
发表于 2012-09-26 14:23 |只看该作者
本帖最后由 winway1988 于 2012-09-26 14:27 编辑
  1. echo -n "abcaba asdfasdf asdfasdfasdf" | awk -vRS=' ' -vFS='' '{for(i=1;i<=NF;++i)a[$i]++;l=asort(a,A);for(i=l;i>=1;--i)b[NR OFS $0]=b[NR OFS $0] OFS A[i];delete a}END{for(i in b)print i,b[i] | "sort -gr -k3"}'| cut -d ' ' -f2
复制代码

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
8 [报告]
发表于 2012-09-27 10:34 |只看该作者
awk 太强大,来一个非 awk 的:
  1. [seesea@UC ~]$ for str in abcaba asdfasdf asdfasdfasdf; do printf "%-20d\t$str\n" $(echo $str | sed 's/\B/\n/g' | sort | uniq -c | sed -rn 's/^ *| [^ ]+//g;1h;1!H;$!b;g;s/\n//g;p') | sed 's/ /0/g'; done | sort -r | cut -f2
  2. asdfasdfasdf
  3. abcaba
  4. asdfasdf
复制代码

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
9 [报告]
发表于 2012-09-27 11:36 |只看该作者
把上述思路转成 awk 后发现和 6楼 yinyuemi 的类似:

  1. echo -n "abcaba asdfasdf asdfasdfasdf" | awk -vRS=' ' -vFS='' '
  2. {
  3.     ar_result[calc_weight($0)]=$0
  4. }
  5. END {
  6.     for (i = asorti(ar_result, ar_order); i >=1; --i)
  7.     {
  8.         print ar_result[ar_order[i]]
  9.     }
  10. }
  11. function calc_weight(str)
  12. {
  13.     delete ar_weight
  14.     for (i = 1; i <= NF; ++i)
  15.     {
  16.         ar_weight[$i]++
  17.     }
  18.     asort(ar_weight)
  19.     w=""
  20.     for (i = NF; i >= 1; --i)
  21.     {
  22.         w=w""ar_weight[i]
  23.     }
  24.     w=sprintf("%-20s", w)
  25.     gsub(/ /, "0", w)
  26.     return w
  27. }
  28. '
复制代码

论坛徽章:
0
10 [报告]
发表于 2012-09-27 13:15 |只看该作者
  1. echo "abcaba asdfasdf asdfasdfasdf" |awk 'BEGIN{RS=" |\n";FS=""}{for(i=1;i<=NF;i++)a[$i]+=1}{for(k in a) b=b a[k]""k" "}{c[b]=$0;delete a;b=""}END{l=asorti(c,d);for(i=l;i>0;i--)print c[d[i]]}'
  2. asdfasdfasdf
  3. abcaba
  4. asdfasdf
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP