是微软推出的新一代英语学习引擎,里面收录了很多我们常见的单词。但现实生活中,我们也经常能看到一些毫无规则的字符串,导致词典无法正常收录,不过,我们是否可以从无规则的字符串中提取出正规的单词呢? 例如有一个字符串"iinbinbing",截取不同位置的字符‘b’、‘i’、‘n’、‘g’组合成单词"bing"。若从1开始计数的话,则‘b’ ‘i’ ‘n’ ‘g’这4个字母出现的位置分别为(4,5,6,10)
(4,5,9,10),(4,8,9,10)和(7,8,9,10),故总共可以组合成4个单词”bing“。 咱们的问题是:现给定任意字符串,只包含小写‘b’ ‘i’ ‘n’ ‘g’这4种字母,请问一共能组合成多少个单词bing? 字符串长度不超过10000,由于结果可能比较大,请输出对10^9 + 7取余数之后的结果。
思路:bing的次数=b的次数+bi的次数+...
public class Test
{
public static int howmany(String s)
{
int b_count=0;
int bi_count=0;
int bin_count=0;
int bing_count=0;
for (int i = 0,length=s.length(); i < length; i++) {
switch(s.charAt(i))
{
case ‘b‘: b_count=++b_count% 1000000007;
break;
case ‘i‘: bi_count=bi_count% 1000000007+b_count;
break;
case ‘n‘: bin_count=bin_count% 1000000007+bi_count;
break;
case ‘g‘: bing_count=bing_count% 1000000007+bin_count;//bing出现的次数=b出现的次数+i出现的次数+...
break;
}
}
return bing_count% 1000000007;
}
//start 提示:自动阅卷起始唯一标识,请勿删除或增加。
public static void main(String args[])
{
System.out.println(howmany("iinbinbing"));
}
//end //提示:自动阅卷结束唯一标识,请勿删除或增加。
}
-----------------------------------------------------------------------------------------------------------------------
在二十进制中,我们除了使用数字0-9以外,还使用字母a-j(表示10-19),给定两个二十进制整数,求它们的和。
输入是两个二十进制整数,且都大于0,不超过100位;
输出是它们的和(二十进制),且不包含首0。我们用字符串来表示二十进制整数。
挑战没成功!解析数组出错,但我在本地测试就能通过,这里记录下
思路1:String-->char[]-->char-->int-->char-->String(这条路我是走通的)
package bl.test;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;
public class Test
{
static boolean f=false;//判断是否有进位
static int count;
static Map<Character, Integer> map=new HashMap<Character, Integer>();//字符转换成数字
static Map<Integer,Character> map1=new HashMap<Integer,Character>();
static String str="";
static String str1="";
public static String calculate(String x,String y)
{
//合法性判断(不以0开头,只包含0~9和a~j,总位数小于100)
String test="[^0][0-9a-j]{0,101}";
if(Pattern.matches(test, x)&&Pattern.matches(test, y)){
//字符--数字
for (int i = 97, j=10; i <=106; i++,j++) {
map.put((char)i, j);
}
//数字--字符
for (int i = 10, j=97; i <=19; i++,j++) {
map1.put(i, (char)j);
}
for(int i1=0,j1=48;i1<=9;i1++,j1++){
map1.put(i1,(char)j1);
}
int temp_res;//存放两个字符的中间运算结果
int get1 = 0;//最后填入的结果
int a=x.length();
int b=y.length();
if(a>=b){
for(int i=b-1,j=a-1;i>=0;i--,j--){
temp_res=getValue(y.charAt(i))+getValue(x.charAt(j));
get1=getValue1(temp_res,get1);
str=str+String.valueOf(map1.get(get1));
if(i==0&&temp_res>=20){//运算到最后一位且有进位
if(j>0){
for (int k = j-1; k>=0; k--) {
get1=getValue1(getValue(x.charAt(k)),get1);
str=str+String.valueOf(map1.get(get1));
}
}else{
str=str+"1";//两个字符串长度相同且有进位的时候
}
}else if(i==0){
for (int k = j-1; k>=0; k--) {
str=str+String.valueOf(map1.get(getValue(x.charAt(k))));
}
}
}
}else{
for(int i=a-1,j=b-1;i>=0;i--,j--){
temp_res=getValue(x.charAt(i))+getValue(y.charAt(j));
get1=getValue1(temp_res,get1);
str=str+String.valueOf(map1.get(get1));
if(i==0&&temp_res>=20){
for (int k = j-1; k>=0; k--) {
get1=getValue1(getValue(y.charAt(k)),get1);
str=str+String.valueOf(map1.get(get1));
}
}else if(i==0){
for (int k = j-1; k>=0; k--) {
str=str+String.valueOf(map1.get(getValue(y.charAt(k))));
}
}
}
}
}else{
return "输入格式错误";
}
//倒序输出
char[] charArrage=str.toCharArray();
for(int i=charArrage.length-1;i>=0;i--){
str1+=charArrage[i];
}
return str1;
}
//r结算得到的数值,r_t该填的数值。处理进位
public static int getValue1(int r,int r_t){
if(f){
r=r+1;
f=false;
getValue1(r,r_t);
}
if(r>=20){//有进位
r_t=r%20;
f=true;
return r_t;
}else{
r_t=r;
f=false;
return r_t;
}
}
public static int getValue(char a){//字符转换成int类型,方便计算
if(map.get(a)!=null){
return (Integer) map.get(a);
}else{
return Integer.parseInt(String.valueOf(a));
}
}
//start 提示:自动阅卷起始唯一标识,请勿删除或增加。
public static void main(String args[])
{
System.out.println(calculate("1","10"));
}
//end //提示:自动阅卷结束唯一标识,请勿删除或增加。
}思路2:通过找20进制计算简的ASSIC码值的规律(这条路被卡死了)
package csdnchallenge;
import java.util.regex.Pattern;
public class Test
{
public static String calculate(String x,String y)
{
//合法性判断(不以0开头,只包含0~9和a~j,总位数小于100)
String test="[^0][0-9a-j]{0,101}";
if(Pattern.matches(test, x)&&Pattern.matches(test, y)){
int a=x.length();
int b=y.length();
int temp=(a<=b?a:b);//temp取二者间较小的
//char[] result=new char[2];
String result="";
String temp_result;
for(int i=temp-1; i>=0;i--) {
char c;
int t=(int)x.charAt(i)+(int)y.charAt(i);
if((int)x.charAt(i)>=97||(int)y.charAt(i)>=97){//有一个为字符
if(t>=106&&(t<=)){
}
}
//for(int k=96;k<=206;k++){
if(t<106){//之和小于10
temp_result=String.valueOf( Integer.parseInt(String.valueOf(x.charAt(i)))+Integer.parseInt(String.valueOf(x.charAt(i))));
result=result+temp_result;
}else{//大于10小于
}
// }
// temp_result=(char)((int)x.charAt(i)+(int)y.charAt(i));
}
//return new String(result);
}else{
System.out.println("输入格式错误");;
}
return "error";
//数字0-9 assic 48-57
//字符a-j assic 97--106
// if((int)x.charAt(i)<=57){
// if((int)y.charAt(i)<=57){
// Integer.parseInt(String.valueOf(c))
// }
// }
// System.out.println("---"+((int)x.charAt(i)+(int)y.charAt(i)));
//System.out.println((int)‘1‘+(int)‘j‘);//155
// System.out.println((int)‘1‘+(int)‘i‘);//154
// System.out.println(((int)‘9‘+(int)‘1‘)+"---"+((int)‘8‘+(int)‘2‘)+"--"+((int)‘4‘+(int)‘6‘));//106---106--106
//System.out.println(((int)‘2‘+(int)‘6‘)+"=="+(char)‘8‘);//104==8
//System.out.println("---"+(int)‘j‘+"==="+(char)106);//106===j
// for(){}
/* switch(x.charAt(i))
{
case ‘a‘:c=10;
break;
}
switch(y.charAt(i))
{
case ‘a‘:d=10;
break;
}
int e=(c+d)%20;*/
}
/*public static String zz(String str){
String test="[^0][0-9a-j]{1,100}";
if(Pattern.matches(test, str)){
return "ok";
}else{
return "no";
}*/
//start 提示:自动阅卷起始唯一标识,请勿删除或增加。
public static void main(String args[])
{
// System.out.println(calculate("1","1"));
//107---97
// System.out.println((int)‘3‘+(int)‘8‘+"---"+(int)‘a‘);
System.out.println((int)‘3‘+(int)‘6‘+"---"+(int)‘9‘);//105---57 相差48
System.out.println((int)‘3‘+(int)‘7‘+"---"+(int)‘a‘);//106---97
//System.out.println((int)‘9‘+(int)‘9‘+"---"+(int)‘i‘);//114---105(相差9)
//System.out.println((int)‘8‘+(int)‘9‘+"---"+(int)‘h‘);//113---104
//System.out.println((int)‘7‘+(int)‘9‘+"---"+(int)‘g‘);//112---103
System.out.println((int)‘5‘+(int)‘5‘+"---"+(int)‘a‘);//106---97
System.out.println((int)‘5‘+(int)‘6‘+"---"+(int)‘b‘);//107---98
System.out.println((int)‘a‘+(int)‘a‘+"---"+(char)(194-48));//194---?
System.out.println((int)‘j‘+(int)‘j‘+"---"+(char)(212-48));//163---?
// System.out.println((int)‘8‘+(int)‘a‘+"---"+(int)‘i‘);//153---105(相差48)
// System.out.println((int)‘b‘+(int)‘1‘+"---"+(int)‘c‘);//147---99
//System.out.println((int)‘a‘+(int)‘1‘+"---"+(int)‘b‘);//146---98
// System.out.println((int)‘3‘+(int)‘4‘+"---"+(int)‘7‘);//103---55(相差48)
//System.out.println((int)‘3‘+(int)‘5‘+"---"+(int)‘8‘); //104---56
//108---98
// System.out.println((int)‘4‘+(int)‘8‘+"---"+(int)‘b‘);
//System.out.println((int)‘6‘+(int)‘6‘+"---"+(int)‘b‘);
//char a=‘9‘,b=‘a‘;
//char a1=‘b‘,b1=‘c‘;
//char a2=‘4‘,b2=‘6‘;
//char t=‘j‘,t1=‘0‘,t2=‘1‘,t3=‘2‘;
//57 97 98 99 52 54 106 48 49 50
//System.out.println((int)a+" "+(int)b+" "+(int)a1+" "+(int)b1+" "+(int)a2+" "+(int)b2+" "+(int)t+" "+(int)t1+" "+(int)t2+" "+(int)‘2‘);
//System.out.println(a+b);//154
//System.out.println(a1+b1);//197
//System.out.println(a2+b2);//106
}
//end //提示:自动阅卷结束唯一标识,请勿删除或增加。
}原文:http://blog.csdn.net/bailin0007/article/details/18861299