【Java】 英雄会第四届在线编程大赛·线上初赛:带通配符的数 Java实现

题目http://hero.csdn.net/Question/Details?ID=351&ExamID=346

不支持Java...

public class Tst {
	public static void main(String[] args) {
		//思路:36?1?8:236428 = 36?:236 + 1?8:428
		//典型的f(n) = c + f(n-1) 用递归
		//String wStr = "36?1?8",xStr = "236428";
		//String wStr = "8?3",xStr = "910";
		String wStr = "32?",xStr = "345";
		int num = getSubNum(wStr, "?");
		System.out.println(wGlx(wStr, xStr, num));
	}
	
	private static int wGlx(String wStr, String xStr, int num) {
		if("".equals(wStr)) {
			return 0;
		}
		int index = wStr.indexOf("?");
		if(index == -1) {
			int w = Integer.parseInt(wStr);
			int x = Integer.parseInt(xStr);
			return w>x?1:0;
		} else {
			String wStrBefore = wStr.substring(0, index+1);
			String wStrAfter = wStr.substring(index+1);
			String xStrBefore = xStr.substring(0, index+1);
			String xStrAfter = xStr.substring(index+1);
			//System.out.println(wStrBefore + " " + wStrAfter);
			//handler wStrBefore eg '23?','?'	
			if("?".equals(wStrBefore)) {
				int nextNum = num - 1;
				int tmp = Integer.parseInt(xStrBefore);
				return (9-tmp)*xVy(10, nextNum) + wGlx(wStrAfter, xStrAfter, nextNum);
			} else {
				int wStrBeforeNum = Integer.parseInt(wStrBefore.substring(0, index));
				int xStrBeforeNum = Integer.parseInt(xStrBefore.substring(0, index));
				if(wStrBeforeNum < xStrBeforeNum) {
					return 0;
				} else if(wStrBeforeNum == xStrBeforeNum) {
					int nextNum = num - 1;
					int tmp = Integer.parseInt(xStrBefore.substring(index));
					return (9-tmp)*xVy(10, nextNum) + wGlx(wStrAfter, xStrAfter, nextNum);
				} else {
					return xVy(10, num);
				}
				
			}
		}
	}
	
	private static int getSubNum(String a, String b) {
		int num = 0;
		String str = a;
		int index = a.indexOf(b);
		while (index != -1) {
			num++;
			str = str.substring(index + b.length());
			index = str.indexOf(b);
		}
		return num;
	}
	
	private static int xVy(int x, int y) {
		int sum = 1;
		for (int i = 0; i < y; i++) {
			sum *= x;
		}
		return sum;
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zfpigpig

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值