带通配符的整数

package test;

/**
 * @time 2014-3-13
 * @encode UTF-8
 * @question 给定一个带通配符问号的数W,问号可以代表任意一个一位数字。
 *  再给定一个整数X,和W具有同样的长度。
 *   问有多少个整数符合W的形式并且比X大? 
 * */
public class Algo_1 {
	/**
	 * @param num 给定整数
	 * @param pattern 包含通配符的数
	 * */
	public static int howMany(String num,String pattern){
		int pn=0,r=0;//pn 通配符的个数,r 所求整数个数
		for(int j=0;j<pattern.length();j++)
			if(pattern.charAt(j)==TPF)
				pn++;
		for(int j=0;j<pattern.length();j++){
			char cp=pattern.charAt(j),cn=num.charAt(j);
			if(cp==TPF){
				pn--;
				r+=('9'-cn)*pow10(pn);
			}else if(cp<cn)
				return r;
			else if(cp>cn)
				return r+pow10(pn);
		}
		return r;
	}
	/**@param e 指数,且e>=0
	 * @return 10^e
	 * */
	private static int pow10(int e){
		int r=1;
		while(e-->0)
			r*=10;
		return r;
	}
	private static final char TPF='?';//通配符
}

测试程序如下:

package test;

import static org.junit.Assert.*;

import org.junit.Test;

public class Algo_1Test {

	@Test
	public void testHowMany() {
		assertEquals(Algo_1.howMany("5", "?"),4);
		assertEquals(Algo_1.howMany("50", "??"),49);
		assertEquals(Algo_1.howMany("801", "7?0"),0);
		assertEquals(Algo_1.howMany("236428", "36?1?8"),100);
	}

}



 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值