给一个莫斯密码,将其解码

题目描述

定义一个简单的莫斯密码解码器,将一串莫斯密码转换为完整的句子,莫斯密码中用一个空格分隔单个字符,3个空格分隔单词,比如“···· · −·−− ·−−− ··− −·· ·” 解码后为“HEY JUDE”

解题思路

  1. 将莫斯密码先按单词、字符的顺序来分割;
  2. 对从莫斯密码字典中获取对应的字符

代码实现

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

转载于:https://my.oschina.net/u/215547/blog/809056

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值