问题

现在有两个字符串,我们要想办法表现出他们的不同。我们只考虑字符串中的小写字符a-z。首先计算每个小写字母在两个字符串中出现的频率
s1 = “A aaaa bb c”

s2 = “& aaa bbb c d”

s1 has 4 ‘a’, 2 ‘b’, 1 ‘c’

s2 has 3 ‘a’, 3 ‘b’, 1 ‘c’, 1 ‘d’

经过比较a这个字母出现频率最高是在s1中出现4次,b是在s2中出现3次。对于那种最多的频率小于2的不考虑。
对两个字符串的不同可以表示为”1:aaaa/2:bbb”
现在给两个字符串,用以上方法表示它们的不同。

例子

s1 = “my&friend&Paul has heavy hats! &”
s2 = “my friend John has many many friends &”
mix(s1, s2) –> “2:nnnnn/1:aaaa/1:hhh/2:mmm/2:yyy/2:dd/2:ff/2:ii/2:rr/=:ee/=:ss”

s1 = “mmmmm m nnnnn y&friend&Paul has heavy hats! &”
s2 = “my frie n d Joh n has ma n y ma n y frie n ds n&”
mix(s1, s2) –> “1:mmmmmm/=:nnnnnn/1:aaaa/1:hhh/2:yyy/2:dd/2:ff/2:ii/2:rr/=:ee/=:ss”

s1=”Are the kids at home? aaaaa fffff”
s2=”Yes they are here! aaaaa fffff”
mix(s1, s2) –> “=:aaaaaa/2:eeeee/=:fffff/1:tt/2:rr/=:hh”

我的代码

package codewars;import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;public class Mixing {public static String mix(String s1, String s2) {//统计字符串m1的各个字母频率Map<String, Long> m1 = Stream.of(s1.replaceAll("[^a-z]","").split("")).collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));//统计字符串m2的各个字母频率Map<String, Long> m2 = Stream.of(s2.replaceAll("[^a-z]","").split("")).collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));Set<String> set1 = m1.keySet();Set<String> set2 = m2.keySet();Set<String> set3 = new HashSet<>();set3.addAll(set1);set3.addAll(set2);List<String> result = set3.stream().map(e -> {StringBuilder sb = new StringBuilder();if (m1.get(e) != null && m2.get(e) != null && m1.get(e) > 1 && m1.get(e) > m2.get(e)) {for (int i = 0; i < m1.get(e); i++) {sb.append(e);}return "1:"+sb.toString();} else if (m1.get(e) != null && m2.get(e) != null && m1.get(e) > 1 && m1.get(e) == m2.get(e)) {for (int i = 0; i < m1.get(e); i++) {sb.append(e);}return "=:"+sb.toString();} else if (m1.get(e) != null && m2.get(e) != null && m2.get(e) > 1 && m2.get(e) > m1.get(e)) {for (int i = 0; i < m2.get(e); i++) {sb.append(e);}return "2:"+sb.toString();} else if (m1.get(e) != null && m2.get(e) == null && m1.get(e) > 1) {for (int i = 0; i < m1.get(e); i++) {sb.append(e);}return "1:"+sb.toString();} else if (m2.get(e) != null && m1.get(e) == null && m2.get(e) > 1) {for (int i = 0; i < m2.get(e); i++) {sb.append(e);}return "2:"+sb.toString();} else {return "";}}).filter(e -> e.length()>0).sorted(Comparator.comparing(String::length).reversed().thenComparing(Function.identity())).collect(Collectors.toList());return String.join("/", result);}public static void main(String[] args) {System.out.println(Mixing.mix(" In many languages", " there's a pair of functions"));}
}

分析

这道题有点难度,思路是:

  1. 将两个字符串中各个小写字母的频率统计出来,结果是Map,key为字母,value为出现次数
  2. 出去两个字符串中出现的所有小写字母集合set
  3. 遍历set按照问题给出的逻辑拼接出字符串列表list
  4. list按照长度的降序,字符串的字典序排列
  5. 用”/”join出结果

Strings Mix相关推荐

  1. TypeError: Can‘t mix strings and bytes in path components

    TypeError: Can't mix strings and bytes in path components 在运行某程序时,出现以下错误: Can't mix strings and byte ...

  2. Chapter 3. Strings, Vectors and Arrays -C++ Primer 5 notes

    Chapter 3. Strings, Vectors and Arrays What does built-in types include? chapter 2 array maybe more? ...

  3. Swift 学习之Using Swift mix and match, network: 写rss阅读器

    这里面使用到第三方库,因此需要使用mix and match特性. 请大家指出其中的错误,谢谢! rss 阅读器,很简单的代码,只是为了学习Swift语言而写. 1、BaseViewControlle ...

  4. java mix audio_audio_mix-master

    audio_mix-master 所属分类:其他 开发工具:Java 文件大小:186KB 下载次数:5 上传日期:2017-10-30 15:53:26 上 传 者:xiaofei-felix 说明 ...

  5. Android TextView 在strings 里面 实现换行

    在TextView 把text 使用快捷键放到strings 里面 \n是无法被放到里面的 如果想实现换行 可以手动在里面添加 \n 例如写了一个小例子, 如果你写了多语言适配 ,那么在你的其他的st ...

  6. Go 学习笔记(51)— Go 标准库之 strings(字符串比较、字符串前后缀、字符串统计、字符串索引、字符串包含、字符串转换、字符串复制、字符串替换、字符串去除、字符串分割和连接)

    1. 概述说明 import "strings" strings 包实现了用于操作字符的简单函数. strings 包与 bytes 包中的函数用法基本一样. 2. 主要函数 2. ...

  7. 风格化手绘纹理包 CGTrader – Stylized Mix Vol. 41 – Hand Painted Texture Pack

    风格化手绘纹理包 CGTrader – Stylized Mix Vol. 41 – Hand Painted Texture Pack CGTrader–风格化混合第41卷–手绘纹理包 大小解压后: ...

  8. Simple Dynamic Strings(SDS)源码解析和使用说明二

    在<Simple Dynamic Strings(SDS)源码解析和使用说明一>文中,我们分析了SDS库中数据的基本结构和创建.释放等方法.本文将介绍其一些其他方法及实现.(转载请指明出于 ...

  9. Simple Dynamic Strings(SDS)源码解析和使用说明一

    SDS是Redis源码中一个独立的字符串管理库.它是由Redis作者Antirez设计和维护的.一开始,SDS只是Antirez为日常开发而实现的一套字符串库,它被使用在Redis.Disque和Hi ...

最新文章

  1. Docker学习(2)——图文并茂讲解Docker基础命令
  2. debian6 xen4.0安装 guest半虚拟化--tar安装
  3. 暮色森林模组_我的世界怎样进入暮色森林
  4. 007_zkCli.sh
  5. 前端学习(2344):打包和部署
  6. file-max与ulimit的设置,nginx 500错误的原因
  7. 应用Rational工具简化基于J2EE项目(四)分析和工具的进展
  8. json动态生成复杂表头excel_Excel办公用品管理系统,全函数统算,图表动态展示高效轻松...
  9. Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传
  10. 前端自动化测试框架Jest中的匹配器
  11. Linux安装配置CI框架
  12. HandlerSocket简介及安装及卸载
  13. python如何提交作业_提交作业
  14. php完全开发手册下载,thinkphp5完全开发手册
  15. Android Framework 框架系列之PowerManager
  16. tomcat的环境变量的配置
  17. mimikatz免杀过360和火绒
  18. libudev-dev安装错误libudev1 (= 241-7~deb10u7) but 241-7~deb10u6解决
  19. mysql hive 建表语句_Mysql元数据如何生成Hive建表语句注释脚本详解
  20. python-openCV识别银行卡号,车牌同理,代码直接可用

热门文章

  1. EMW3080+STC15轻松实现设备上云1(阿里云物联网平台、智能生活开放平台)
  2. openstack虚拟机的热迁移和疏散
  3. 织梦后台登录后页面一片空白怎么办?
  4. 捣鼓车间 | 学生获奖作品:戒烟帽
  5. 减肥记(减肥topic总结篇)
  6. 软件测试基础理论学习和小案例(一)
  7. android+自定义dns解析,安卓手机玩dnsmasq 搭建自己的DNS服务器
  8. android 单元布局,在Android布局中挖洞
  9. MC9S12XEP100的SPI模块(S12SPIV5)
  10. 用c语言实现文本文件中的字符筛选分析(二)