华为机试4.27:公式修正
公式修正
题目描述
给出一个算术公式,形式为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:公式修正相关推荐
- 牛客在线编程-华为机试-中等
牛客在线编程题目-华为机试-中等 题号 题目 知识点 难度 通过率 HJ16 购物单 动态规划 中等 21.21% HJ17 坐标移动 字符串 中等 24.79% HJ20 密码验证合格程序 数组 字 ...
- 【华为机试真题Java】从入门到入职-真题列表导读
写在前面 本专栏有100+道题(持续更新中),都是往期的HW机试真题,根据过往同学的经验基本都会考到原题.大家有什么不懂的都可以留言. 华为机试有三道题目,第一道和第二道属于简单或中等题,分值为100 ...
- Java算法:华为机试算法(下),华为算法Java版,牛客网华为算法73~108题
接上篇:Java算法:华为机试算法(中),华为算法Java版,牛客网华为算法55~72题 HJ73 计算日期到天数转换 计算日期到天数转换 题目描述 根据输入的日期,计算是这一年的第几天.. 测试 ...
- 【华为机试真题详解】小兔子繁殖详解
文章目录 前言 讲解试题 如何写一个递归函数 DP2 跳台阶 小兔子繁殖 前言 <华为机试真题详解>专栏含牛客网华为专栏.华为面经试题.华为OD机试真题. 如果您在准备华为的面试,期间有想 ...
- 【华为机试】死记硬背没思路?一般人我劝你还是算了吧
大家好,我是哪吒. 五月份之前,如果你参加华为OD机试,收到的应该是2022Q4或2023Q1,这两个都是A卷题. 5月10日之后,很多小伙伴收到的是B卷,那么恭喜你看到本文了,抓紧刷题吧.B卷新题库 ...
- 华为机试在线训练--牛客网(python)第四部分
华为机试在线训练–牛客网(python) 第四部分(31~40) 第三十一题:[中级]单词倒排 题目描述 对字符串中的所有单词进行倒排. 说明: 1.每个单词是以26个大写或小写英文字母构成: 2.非 ...
- 集合篇10.华为机试(涮题记录2)
华为机试 31.成绩排序(**not) 32. 矩阵乘法 33. 24点游戏算法(not) 34.配置文件恢复 35. 查找两个字符串a.b中的最长公共子串 36.MP3光标位置(not) 37.DN ...
- 大师兄教你如何过华为机试
大师兄教你如何过华为机试 宝典1-内功心法 大华为这个大数据时代土豪金海量式的招聘又要开始了!!! 近期听说大华为的校招机试马上就要开始了,由于华为软件岗位的招聘只有技术面跟机试是与技术有关的内容,所 ...
- Java算法:华为机试算法第二版(上),华为算法Java版
牛客网华为机试练习题 文章目录 牛客网华为机试练习题 动态规划问题详解 前言 生活中的动态规划 2. 几个简单的概念 3. DP的典型应用:DAG最短路 4. 对DP原理的一点讨论 5. 例题:最长上 ...
- 【华为机试 Python实现】华为机试题集合(已更新171篇)
文章目录 新手指引 数据结构基础 华为机试真题系列 牛客网华为机试系列 Python 八股文系列 <华为机试真题详解>专栏定价99.9 包含 <华为机试真题>的所有题目. 包含 ...
最新文章
- VR/AR行业发展至今,它的市场规模如何
- echarts——父元素宽度100%,但canvas宽度100px
- 制作wordpress页面的学习记录
- unshift() 方法将一个或多个元素添加到数组的开头,并返回新数组的长度
- JAVA内存模型与线程安全
- Python_目录的简单操作(新建/查看/删除)
- 『深度应用』一文搞懂深度学习人脸识别模型开发流程
- 手机备份时,应该把软件配置也备份起来
- 晚间看图片就高亮,这体验太差
- 实时查看Starlink在轨卫星、地面站数目和分布情况的有趣网站
- JSCORE03(达)
- 计算机视觉与音乐,探索计算机视觉与音频的交叉:基于视觉的音乐相关研究Review...
- app开屏广告实现——借助webview和原生fetch请求实现
- SQL Server数据库技术期末大作业 机票预定信息系统
- 华为鸿蒙系统老手机能用吗_华为使用自家“鸿蒙”系统,旧手机的安卓系统可以更新成那个系统吗?...
- IEEEXTREME15.0 游记
- 内网穿透工具natcross2
- JAVA语言编程练习--图形界面--简易登录界面
- Linux下批处理文件编写
- linux ubuntu18.1安装教程,Ubuntu 18.04上Qmmp安装教程