Strings Mix
问题
现在有两个字符串,我们要想办法表现出他们的不同。我们只考虑字符串中的小写字符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"));}
}
分析
这道题有点难度,思路是:
- 将两个字符串中各个小写字母的频率统计出来,结果是Map,key为字母,value为出现次数
- 出去两个字符串中出现的所有小写字母集合set
- 遍历set按照问题给出的逻辑拼接出字符串列表list
- list按照长度的降序,字符串的字典序排列
- 用”/”join出结果
Strings Mix相关推荐
- 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 ...
- 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? ...
- Swift 学习之Using Swift mix and match, network: 写rss阅读器
这里面使用到第三方库,因此需要使用mix and match特性. 请大家指出其中的错误,谢谢! rss 阅读器,很简单的代码,只是为了学习Swift语言而写. 1、BaseViewControlle ...
- java mix audio_audio_mix-master
audio_mix-master 所属分类:其他 开发工具:Java 文件大小:186KB 下载次数:5 上传日期:2017-10-30 15:53:26 上 传 者:xiaofei-felix 说明 ...
- Android TextView 在strings 里面 实现换行
在TextView 把text 使用快捷键放到strings 里面 \n是无法被放到里面的 如果想实现换行 可以手动在里面添加 \n 例如写了一个小例子, 如果你写了多语言适配 ,那么在你的其他的st ...
- Go 学习笔记(51)— Go 标准库之 strings(字符串比较、字符串前后缀、字符串统计、字符串索引、字符串包含、字符串转换、字符串复制、字符串替换、字符串去除、字符串分割和连接)
1. 概述说明 import "strings" strings 包实现了用于操作字符的简单函数. strings 包与 bytes 包中的函数用法基本一样. 2. 主要函数 2. ...
- 风格化手绘纹理包 CGTrader – Stylized Mix Vol. 41 – Hand Painted Texture Pack
风格化手绘纹理包 CGTrader – Stylized Mix Vol. 41 – Hand Painted Texture Pack CGTrader–风格化混合第41卷–手绘纹理包 大小解压后: ...
- Simple Dynamic Strings(SDS)源码解析和使用说明二
在<Simple Dynamic Strings(SDS)源码解析和使用说明一>文中,我们分析了SDS库中数据的基本结构和创建.释放等方法.本文将介绍其一些其他方法及实现.(转载请指明出于 ...
- Simple Dynamic Strings(SDS)源码解析和使用说明一
SDS是Redis源码中一个独立的字符串管理库.它是由Redis作者Antirez设计和维护的.一开始,SDS只是Antirez为日常开发而实现的一套字符串库,它被使用在Redis.Disque和Hi ...
最新文章
- Docker学习(2)——图文并茂讲解Docker基础命令
- debian6 xen4.0安装 guest半虚拟化--tar安装
- 暮色森林模组_我的世界怎样进入暮色森林
- 007_zkCli.sh
- 前端学习(2344):打包和部署
- file-max与ulimit的设置,nginx 500错误的原因
- 应用Rational工具简化基于J2EE项目(四)分析和工具的进展
- json动态生成复杂表头excel_Excel办公用品管理系统,全函数统算,图表动态展示高效轻松...
- Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传
- 前端自动化测试框架Jest中的匹配器
- Linux安装配置CI框架
- HandlerSocket简介及安装及卸载
- python如何提交作业_提交作业
- php完全开发手册下载,thinkphp5完全开发手册
- Android Framework 框架系列之PowerManager
- tomcat的环境变量的配置
- mimikatz免杀过360和火绒
- libudev-dev安装错误libudev1 (= 241-7~deb10u7) but 241-7~deb10u6解决
- mysql hive 建表语句_Mysql元数据如何生成Hive建表语句注释脚本详解
- python-openCV识别银行卡号,车牌同理,代码直接可用