公式修正

题目描述

给出一个算术公式,形式为A*B=C("表示乘法)。但是该公式可能存在错误,你需要用替换字符的方式进行修正(不可以移动)。请问最少替换多少个字符可以使得原公式成立。 替换一个字符指的是将原公式中某个位置的字符用另外的0~9的字符代替。注意你不能替换公式中的’*’和’=’符号;同时替换后的式子中所有数字都不能包含前导零。

输入描述

第一行包含一个整数T,表示共有多少组测试用例1≤T≤100)。
接下来T 行每包含一个字符串S,表示给定的公式,其一定是A*B=C的格式 保证公式中的A、B、C一定是正整数,并且不含前导零。字符串 S 的长度不超过10。

输出

输出 T行,每行一个整数表示最少要替换多少个字符可以使得公式成立。
如果无论如何都不能使得等式成立则输出-1。

样例1

输入

2
12*12=444
123*123=1

输出

1 -1

解释:

对于第一个测试数据,你只需要替换一个字符,将’4’替换成’1’,即得到12*12=144。
对于第二个测试数据,无法通过替换得到合法的公式。

样例2

输入

1
1*123=123

输出

0

解释:

无需替换,公式本身就是正确的

思路分析

这道题不能想得太复杂,比如S1是4位数,S2是3位数,遍历所有四位数S1(1000-9999),遍历所有三位数S2(100-999),对于每一组S1和S2有唯一确定的S3,进行判断就差不多能过了。

需要注意的就是特殊情况的判断,主要是1*123=8,不是-1而是2,因为可以转为0*123=0。题目要求说的是公式中的A、B、C一定是正整数,但字符换完以后没说不能是0,所以要考虑换成0的情况。

if (n3 == 1 && (n1 == 1 || n2 == 1)) {  // 只有一位,乘数和积都是一位的情况,如果另一位不是1位,则可以变成0*123=0,是2
if ((n1 == 1 && n2 != 1) || (n1 != 1 && n2 == 1)) {list.add(2);continue;}
}

其次就是位数不满足的情况:

if (n3 < n1 + n2 - 1 || n3 > n1 + n2) { // 位数超出限制,是-1list.add(-1);continue;
}

参考代码

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class Main2 {public static void main(String[] args) {Scanner in = new Scanner(System.in);int T = in.nextInt();in.nextLine();String[][] arr = new String[T][3];for (int i = 0; i < T; i++) {String str = in.nextLine();String[] str1 = str.split("\\*");  // 直接按"*"分割不行,需要加上\\String str2 = str1[1];String[] str3 = str2.split("\\=");arr[i][0] = str1[0];arr[i][1] = str3[0];arr[i][2] = str3[1];}List<Integer> list = new ArrayList<>();for (int i = 0; i < arr.length; i++) {int n1 = arr[i][0].length();int n2 = arr[i][1].length();int n3 = arr[i][2].length();int res = Integer.MAX_VALUE;int A = Integer.parseInt(arr[i][0]);int B = Integer.parseInt(arr[i][1]);int C = Integer.parseInt(arr[i][2]);if (n3 == 1 && (n1 == 1 || n2 == 1)) {  // 只有一位,乘数和积都是一位的情况,如果另一位不是1位,则可以变成0*123=0,是2if ((n1 == 1 && n2 != 1) || (n1 != 1 && n2 == 1)) {list.add(2);continue;}}if (n3 < n1 + n2 - 1 || n3 > n1 + n2) { // 位数超出限制,是-1list.add(-1);continue;}int t1 = (int) Math.pow(10, n1);int t2 = (int) Math.pow(10, n2);for (int j = (int) Math.pow(10, n1 - 1); j < t1; j++) {  // 遍历该位数最小值到最大值,如3位数从100到999for (int k = (int) Math.pow(10, n2 - 1); k < t2; k++) {int p = j * k;if (help1(p) == n3) {res = Math.min(res, help2(A, j) + help2(B, k) + help2(C, p));}}}list.add(res);}for (int i = 0; i < list.size(); i++) {if (i == list.size() - 1) {System.out.println(list.get(i));} else {System.out.print(list.get(i) + " ");}}}public static int help1(int x) {int r = 0;while(x != 0) {r++;x /= 10;}return r;}public static int help2(int A, int B) {int r = 0;String a = String.valueOf(A);String b = String.valueOf(B);for (int i = 0; i < a.length(); i++) {if (a.charAt(i) != b.charAt(i)) {r++;}}return r;}
}

华为机试4.27:公式修正相关推荐

  1. 牛客在线编程-华为机试-中等

    牛客在线编程题目-华为机试-中等 题号 题目 知识点 难度 通过率 HJ16 购物单 动态规划 中等 21.21% HJ17 坐标移动 字符串 中等 24.79% HJ20 密码验证合格程序 数组 字 ...

  2. 【华为机试真题Java】从入门到入职-真题列表导读

    写在前面 本专栏有100+道题(持续更新中),都是往期的HW机试真题,根据过往同学的经验基本都会考到原题.大家有什么不懂的都可以留言. 华为机试有三道题目,第一道和第二道属于简单或中等题,分值为100 ...

  3. Java算法:华为机试算法(下),华为算法Java版,牛客网华为算法73~108题

    接上篇:Java算法:华为机试算法(中),华为算法Java版,牛客网华为算法55~72题   HJ73 计算日期到天数转换 计算日期到天数转换 题目描述 根据输入的日期,计算是这一年的第几天.. 测试 ...

  4. 【华为机试真题详解】小兔子繁殖详解

    文章目录 前言 讲解试题 如何写一个递归函数 DP2 跳台阶 小兔子繁殖 前言 <华为机试真题详解>专栏含牛客网华为专栏.华为面经试题.华为OD机试真题. 如果您在准备华为的面试,期间有想 ...

  5. 【华为机试】死记硬背没思路?一般人我劝你还是算了吧

    大家好,我是哪吒. 五月份之前,如果你参加华为OD机试,收到的应该是2022Q4或2023Q1,这两个都是A卷题. 5月10日之后,很多小伙伴收到的是B卷,那么恭喜你看到本文了,抓紧刷题吧.B卷新题库 ...

  6. 华为机试在线训练--牛客网(python)第四部分

    华为机试在线训练–牛客网(python) 第四部分(31~40) 第三十一题:[中级]单词倒排 题目描述 对字符串中的所有单词进行倒排. 说明: 1.每个单词是以26个大写或小写英文字母构成: 2.非 ...

  7. 集合篇10.华为机试(涮题记录2)

    华为机试 31.成绩排序(**not) 32. 矩阵乘法 33. 24点游戏算法(not) 34.配置文件恢复 35. 查找两个字符串a.b中的最长公共子串 36.MP3光标位置(not) 37.DN ...

  8. 大师兄教你如何过华为机试

    大师兄教你如何过华为机试 宝典1-内功心法 大华为这个大数据时代土豪金海量式的招聘又要开始了!!! 近期听说大华为的校招机试马上就要开始了,由于华为软件岗位的招聘只有技术面跟机试是与技术有关的内容,所 ...

  9. Java算法:华为机试算法第二版(上),华为算法Java版

    牛客网华为机试练习题 文章目录 牛客网华为机试练习题 动态规划问题详解 前言 生活中的动态规划 2. 几个简单的概念 3. DP的典型应用:DAG最短路 4. 对DP原理的一点讨论 5. 例题:最长上 ...

  10. 【华为机试 Python实现】华为机试题集合(已更新171篇)

    文章目录 新手指引 数据结构基础 华为机试真题系列 牛客网华为机试系列 Python 八股文系列 <华为机试真题详解>专栏定价99.9 包含 <华为机试真题>的所有题目. 包含 ...

最新文章

  1. VR/AR行业发展至今,它的市场规模如何
  2. echarts——父元素宽度100%,但canvas宽度100px
  3. 制作wordpress页面的学习记录
  4. unshift() 方法将一个或多个元素添加到数组的开头,并返回新数组的长度
  5. JAVA内存模型与线程安全
  6. Python_目录的简单操作(新建/查看/删除)
  7. 『深度应用』一文搞懂深度学习人脸识别模型开发流程
  8. 手机备份时,应该把软件配置也备份起来
  9. 晚间看图片就高亮,这体验太差
  10. 实时查看Starlink在轨卫星、地面站数目和分布情况的有趣网站
  11. JSCORE03(达)
  12. 计算机视觉与音乐,探索计算机视觉与音频的交叉:基于视觉的音乐相关研究Review...
  13. app开屏广告实现——借助webview和原生fetch请求实现
  14. SQL Server数据库技术期末大作业 机票预定信息系统
  15. 华为鸿蒙系统老手机能用吗_华为使用自家“鸿蒙”系统,旧手机的安卓系统可以更新成那个系统吗?...
  16. IEEEXTREME15.0 游记
  17. 内网穿透工具natcross2
  18. JAVA语言编程练习--图形界面--简易登录界面
  19. Linux下批处理文件编写
  20. linux ubuntu18.1安装教程,Ubuntu 18.04上Qmmp安装教程

热门文章

  1. 迅捷pdf转换器如何转换成word文档
  2. 网易博客搬家至CSDN博客指南
  3. Matlab 数字图像处理 学习笔记(一)
  4. reactJS 干货(reactjs 史上最详细的解析干货)
  5. c语言输入坐标三角形周长面积,3.1.7计算三角形周长和面积
  6. 向量叉乘计算多边形面积
  7. 如何防止局域网病毒春风吹又生--之二
  8. 如何绘制日式厚涂插画_厚涂样式
  9. 6.1 静态路由及默认路由的基本配置
  10. Python制作一个12306查票程序脚本(附完整代码,仅供学习参考)