面试题之“约德尔测试”

来源:互联网 发布:金十数据官网财经日历 编辑:程序博客网 时间:2024/04/29 00:07
题目描述

兰博和提莫闲聊之后,回归到了他们的正题,约德尔人的未来。

说起约德尔人的未来,黑默丁格曾经提出了一个约德尔测试,将约德尔人的历史的每个阶段都用一个字符表达出来。(包括可写字符,不包括空格。)。然后将这个字符串转化为一个01串。转化规则是如果这个字符如果是字母或者数字,这个字符变为1,其它变为0。然后将这个01串和黑默丁格观测星空得到的01串做比较,得到一个相似率。相似率越高,则约德尔的未来越光明。

请问:相似率为多少?

import java.math.BigDecimal;import org.apache.commons.lang3.StringUtils;/** * 约德尔测试 * 兰博和提莫闲聊之后,回归到了他们的正题,约德尔人的未来。 * 说起约德尔人的未来,黑默丁格曾经提出了一个约德尔测试,将约德尔人的历史的每个阶段都用一个字符表达出来。(包括可写字符,不包括空格。)。 * 然后将这个字符串转化为一个01串。转化规则是如果这个字符如果是字母或者数字,这个字符变为1,其它变为0。 * 然后将这个01串和黑默丁格观测星空得到的01串做比较,得到一个相似率。相似率越高,则约德尔的未来越光明。 * 请问:相似率为多少? * @author xiaowei 2017年11月16日 下午2:20:23 */public class YueDeErTest {    public static void main(String[] args) {        YueDeErTest test = new YueDeErTest();        System.out.println(test.what("we576t5weq67wqg", "01101011010110110"));    }    public float what(String str, String numStr) {        if (StringUtils.isEmpty(str) || StringUtils.isEmpty(numStr)) {            return 0f;        }        // 字符串转换        char[] ch = str.toCharArray();        StringBuffer sb = new StringBuffer();        boolean isWordOrNum = false;        for (char c : ch) {            isWordOrNum = (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')                          || (c >= '0' && c <= '9');            sb.append(isWordOrNum ? 1 : 0);        }        // 计算长度        int minLen = ch.length;        int maxLen = numStr.length();        if (minLen > maxLen) {            int temp = minLen;            minLen = maxLen;            maxLen = temp;        }        // 计算相同位数        char[] numStrCh = numStr.toCharArray();        int count = 0;        for (int i = 0; i < minLen; i++) {            if (sb.charAt(i) == numStrCh[i]) {                count++;            }        }        // 计算相似度        BigDecimal big1 = new BigDecimal(String.valueOf(count));        BigDecimal big2 = new BigDecimal(String.valueOf(maxLen));        return big1.divide(big2, 4, BigDecimal.ROUND_HALF_DOWN).floatValue();    }}

程序输出结果:

0.5294


原创粉丝点击