首页 > 其他 > 详细

挑战:截取bing正规和20进制的加法

时间:2014-01-29 15:45:45      阅读:563      评论:0      收藏:0      [点我收藏+]

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



挑战:截取bing正规和20进制的加法

原文:http://blog.csdn.net/bailin0007/article/details/18861299

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!