是微软推出的新一代英语学习引擎,里面收录了很多我们常见的单词。但现实生活中,我们也经常能看到一些毫无规则的字符串,导致词典无法正常收录,不过,我们是否可以从无规则的字符串中提取出正规的单词呢? 例如有一个字符串"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 //提示:自动阅卷结束唯一标识,请勿删除或增加。 }