写的不知道有木有问题

package coding;

import java.util.Random;
import java.util.Scanner;

/**
 * yeah,现场出题,现场coding,现场评奖,现场颁奖。 So,想来现场参加火热决赛直取ipad Air的,请先通过线上初赛题目带通配符的数:
 * 给定一个带通配符问号的数W,问号可以代表任意一个一位数字。 再给定一个整数X,和W具有同样的长度。 问有多少个整数符合W的形式并且比X大? 输入格式
 * 多组数据,每组数据两行,第一行是W,第二行是X,它们长度相同。在[1..10]之间. 输出格式 每行一个整数表示结果。 答题说明输入样例 36?1?8
 * 236428 8?3 910 ? 5 输出样例 100 0 4 友情提醒:
 * 1、本题用OJ模式答题,答题时可把下面输入框内预留的函数全部直接去掉,自己另起函数名实现本题功能。 2、因为本系统的OJ模式对于Java 和 C#
 * 的支持有问题,所以本题暂不支持这两种语言挑战。
 *
 * @author Administrator 3月13
 */
public class TongPeiFu {

 private Scanner input = new Scanner(System.in);

 /*
  * 暂时想到已数组对应位比较和数字嵌套循环两种貌似可行的方法,我采用数组
  */

 public void dealWithNum() {
  // 先接收一个输入的位数
  System.out.println("请输入该数的位数:");
  int n = input.nextInt();
  // 随机两个n位的数,分别放进两个数组(直接随机n次0-9就行了)
  Random rd = new Random();
  int[] arrA = new int[n];
  int[] arrB = new int[n];
  int num = 0;
  while (true) {
   for (int i = 0; i < n; i++) {
    if (rd.nextInt(2) == 0) {
     // -1代表分配符,要记录下? 的个数
     arrA[i] = -1;
     num++;
    } else {
     arrA[i] = rd.nextInt(10);
    }
    arrB[i] = rd.nextInt(10);
   }
   if (num > 0) {
    break;// 保证有通配符
   }
  }

  inputStyle(arrA, arrB);
  outputStyle(arrA, arrB, n, num);
 }

 // 输入样例
 public void inputStyle(int[] arrA, int[] arrB) {
  System.out.println("输入样例");
  for (int a : arrA) {
   if (a == -1) {
    System.out.print("?");
   } else {
    System.out.print(a);
   }
  }
  System.out.println();
  for (int b : arrB) {
   System.out.print(b);
  }
 }

 // 输出样例(主要方法),传入数组A,数组B,位数n,通配符的个数
 // 要求出符合数组A比B大的所有可能的数目
 public void outputStyle(int[] arrA, int[] arrB, int n, int num) {
  int answer = 0;// 记录当前的结果
  boolean flag = false;// 标记是否出现了通配符,默认没出现
  // 遍历两个数组,将对应位置进行比较
  for (int i = 0; i < n; i++) {

   if (arrA[i] > arrB[i]) {
    // 如果当前位置A比B大(A不是通配符),可以得到结果退出循环了
    // 但是要判断之前有无产生结果以及加上已有的结果
    // 10的num次方
    int temp = 1;
    for (int j = 0; j < num; j++) {
     temp = temp * 10;
    }
    // 只要出现过通配符,不管num是否为0,都要加上一次当前的情况
    if (flag) {
     if (temp == 1) {
      // 此时num为0,temp该为0
      answer = answer + temp;
     } else {
      answer = answer + temp + 1;
     }
    } else {
     // 若没出现过,那么不加1
     if (temp != 1) {
      answer = answer + temp;
     }
    }
    break;
   }
   if ((arrA[i] < arrB[i]) && (arrA[i] != -1)) {
    break;
   }
   if (arrA[i] == -1) {
    flag = true;
    num--;// 当前的通配符可以舍去了
    int f = 9 - arrB[i];// 记录当前位置A大于B的可能数
    // 如果f>0才进行后面的判断
    if (f > 0) {
     // 看数组后面还有无通配符
     if (num > 0) {
      int temp = 1;
      for (int j = 0; j < num; j++) {
       temp = temp * 10;
      }
      // 记录确定的满足条件的可能数
      temp = temp * f;
      answer = answer + temp;
     } else {
      answer = answer + f;
     }
    }
   }

  }
  System.out.println();
  System.out.println("输出样例");
  System.out.println(answer);
 }

 public static void main(String[] args) {
  TongPeiFu t = new TongPeiFu();
  t.dealWithNum();
 }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值