题目描述
定义一个简单的莫斯密码解码器,将一串莫斯密码转换为完整的句子,莫斯密码中用一个空格分隔单个字符,3个空格分隔单词,比如“···· · −·−− ·−−− ··− −·· ·” 解码后为“HEY JUDE”
解题思路
- 将莫斯密码先按单词、字符的顺序来分割;
- 对从莫斯密码字典中获取对应的字符
代码实现
package com.codewars;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import java.util.HashMap;
import java.util.Map;
import org.junit.Test;
public class MorseCodeTest {
static class MorseCodeDecoder {
private static Map<String, String> codeMap;
static {
codeMap = new HashMap<String, String>();
// 26个字母的莫尔斯电码加密
codeMap.put("A", ".-");codeMap.put("B", "-...");codeMap.put("C", "-.-.");codeMap.put("D", "-..");
codeMap.put("E", ".");codeMap.put("F", "..-.");codeMap.put("G", "--.");codeMap.put("H", "....");
codeMap.put("I", "..");codeMap.put("J", ".---");codeMap.put("K", "-.-");codeMap.put("L", ".-...");
codeMap.put("M", "--");codeMap.put("N", "-.");codeMap.put("O", "---");codeMap.put("P", ".--.");
codeMap.put("Q", "--.-");codeMap.put("R", ".-.");codeMap.put("S", "...");codeMap.put("T", "-");
codeMap.put("U", "..-");codeMap.put("V", "...-");codeMap.put("W", ".--");codeMap.put("X", "-..-");
codeMap.put("Y", "-.--");codeMap.put("Z", "--..");
// 数字的莫尔斯电码加密
codeMap.put("0", "-----");codeMap.put("1", ".----");codeMap.put("2", "..---");codeMap.put("3", "...--");
codeMap.put("4", "....-");codeMap.put("5", ".....");codeMap.put("6", "-....");codeMap.put("7", "--...");
codeMap.put("8", "---..");codeMap.put("9", "----.");
// 标点符号的莫尔斯电码加密
codeMap.put(".", "-----");codeMap.put(":", ".----");codeMap.put(",", "..---");codeMap.put(";", "...--");
codeMap.put("?", "....-");codeMap.put("=", ".....");codeMap.put("'", "-....");codeMap.put("/", "--...");
codeMap.put("!", "....-");codeMap.put("-", ".....");codeMap.put("_", "-....");codeMap.put("\"", "--...");
codeMap.put("(", "....-");codeMap.put(")", ".....");codeMap.put("$", "-....");codeMap.put("&", "--...");
codeMap.put("@", "---..");
}
/**
* 获取密码对应的字符
* @param code
* @return
*/
private static String getChar(String code) {
return codeMap.get(code);
}
/**
* 获取字符对应的密码
* @param ch
* @return
*/
private static String getCode(String ch) {
for(Map.Entry<String, String> entry : codeMap.entrySet()) {
if (ch.equals(entry.getValue())) {
return entry.getKey();
}
}
return "";
}
/**
* 解码
* @param morseCode
* @return
*/
public static String decode(String morseCode) {
String words = "";
String[] codes = morseCode.split(" ");
for(String code : codes) {
String[] chars = code.split(" ");
for(String ch : chars) {
words += getCode(ch);
}
words += " ";
}
return words.trim();
}
/**
* 编码
* @param sentence
* @return
*/
public static String encode(String sentence) {
String codes = "";
String[] words = sentence.split(" ");
for(String code : words) {
String[] chars = code.split("");
for(String ch : chars) {
codes += getChar(ch) + " ";
}
codes = codes.trim() + " ";
}
return codes.trim();
}
}
@Test
public void testExampleFromDescription() {
assertThat(MorseCodeDecoder.decode(".... . -.-- .--- ..- -.. ."), is("HEY JUDE"));
}
}
原题地址:https://www.codewars.com/kata/decode-the-morse-code/train/java