做了一个关于字符转换及计算的思考题,记录一下。。。。
设定,出现的字符在a-z及A-Z之间,(1)其中a/A -z/Z分别可以解码为数字的1-26;(2)在字符中当遇到大写A-Z时,可以转换为相应的两个小写a-z;(3)解码准则为value=连续字符个数的平方*该字符所代表的数字,如aaa的value=3*3*1=9,bBb相当于bbbb其
value=4*4*2=32。
设计实现如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String line = "";
try {
System.out.print("请输入需要解密的密语个数: ");
line = bf.readLine();
while(!isNumeric(line)){
System.out.print("请输入需要解密的密语个数: ");
line = bf.readLine();
}
int num = Integer.parseInt(line);
int[] results = new int[num];
for(int i = 0; i < num; i++){
line = bf.readLine();
results[i] = getValue(line);
}
for(int i = 0; i < num; i++){
System.out.println(results[i]);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 计算密语字符串的值
* @param lan
* @return
*/
public static int getValue(String lan){
int result = 0;
int length = lan.length();
if(length <= 0){
return 0;
}
StringBuilder sb = new StringBuilder();
for(int i = 0; i < length; i++){
char s = lan.charAt(i);
if(s >= 97){
sb.append(s);
}else{
sb.append((char)Integer.parseInt(String.valueOf((s+32))))
.append((char)Integer.parseInt(String.valueOf((s+32))));
}
}
char temp;
char index;
int i = 0;
int j = i+1;
int le = 1; //连续字符长度
while(i < sb.length()){
temp = sb.charAt(i);
while(j < sb.length()){
index = sb.charAt(j);
if(temp == index){
le++;
j++;
if(j == sb.length()){ //最后一个字符 连续字符
result += (le * le * Integer.parseInt(String.valueOf((temp - 96))));
}
}else{
result += (le * le * Integer.parseInt(String.valueOf((temp - 96))));
break;
}
}
if(i == sb.length()-1){ //最后一个字符 单个字符
result += (le * le * Integer.parseInt(String.valueOf((temp - 96))));
break;
}
i = j;
j = i+1;
le = 1;
}
return result;
}
/**
* 判断一个字符串是否为数字
* @param str
* @return
*/
public static boolean isNumeric(String str){
Pattern pattern = Pattern.compile("[0-9]*");
Matcher isNum = pattern.matcher(str);
if( !isNum.matches() ){
return false;
}
return true;
}
}