华为OD机试真题-靠谱的车

题目描述

程序员小明打了一辆出租车去上班。出于职业敏感,他注意到这辆出租车的计费表有点问题,总是偏大。

出租车司机解释说他不喜欢数字4,所以改装了计费表,任何数字位置遇到数字4就直接跳过,其余功能都正常。

比如:

23再多一块钱就变为25;

39再多一块钱变为50;

399再多一块钱变为500;

小明识破了司机的伎俩,准备利用自己的学识打败司机的阴谋。

给出计费表的表面读数,返回实际产生的费用。

输入描述:

只有一行,数字 N,表示里程表的读数。

(1<=N<=888888888)。

输出描述:

一个数字,表示实际产生的费用。以回车结束。

示例1

输入:

5

输出:

4

说明:

5 表示计费表的表面读数。

4 表示实际产生的费用其实只有4块钱。

示例2

输入:

17

输出:

15

说明:

17 表示计费表的表面读数。

15 表示实际产生的费用其实只有15块钱。

示例3

输入:

100

输出:

81

说明:

100 表示计费表的表面读数。

81 表示实际产生的费用其实只有81块钱。

解题思路

这个问题本质上是一个如何将 9进制的数转化为 10 进制的数,因为计价器数 9次进一个位

我们通常的9进制表示包含的数字为

0 1 2 3 4 5 6 7 8

而题目中的数字使用的是

0 1 2 3 5 6 7 8 9

把目标数据的 5 6 7 8 9 替换为对应的 4 5 6 7 8

5 -> 4
6 -> 5
7 -> 6
8 -> 7
9 -> 8

替换后直接解析为十进制数据即可

源码 Java

public class Taxi {

	Input input;
	@BeforeEach
	void setUp() {
		input = new Input("888888888");
	}

	@Test
	public  void real() {
		Map<Character, Character> map = new HashMap<>();
		map.put('0', '0');
		map.put('1', '1');
		map.put('2', '2');
		map.put('3', '3');
		map.put('5', '4');
		map.put('6', '5');
		map.put('7', '6');
		map.put('8', '7');
		map.put('9', '8');

		String s = input.nextLine();
		StringBuilder sb= new StringBuilder();
		// 将输入数据转换为我们通常习惯表示的 9 进制的数
		for (int i = 0; i < s.length(); i++) {
			sb.append(map.get(s.charAt(i)));
		}

		System.out.println(Integer.parseInt(sb.toString(), 9));
	}

}
#如果中了500万,你会离职吗?##我想象的工作vs实际工作#
OD 机试 算法 文章被收录于专栏

中华有为 中华有为 中华有为 中华有为 中华有为 中华有为 中华有为 中华有为 中华有为 中华有为 中华有为 中华有为 中华有为 中华有为 中华有为 中华有为 中华有为 中华有为 中华有为 中华有为 中华有为

全部评论

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务