华为od机试100分题-靠谱的车

昨天机试试过,能100%过,如果有更优解法,欢迎评论区指出。

题目描述:

思路与解析:

每次遇到4就跳过,所以相当于进制由变成9,对于每位如果大于4,说明对这位需要多处理一次,即这一位减去1。具体操作:

1、输入一个数。

2、用vector容器或者数组存储每个位对应的值,如果大于4单独对这一位减1。

3、将vector容器的内容取出并按9进制算出答案。

代码如下:

#include <iostream>
#include<vector>
using namespace std;

int main(){
    int n;
    cin >> n;
    vector<int> arr;
    while (n) {//将每一位放入容器,也可以插到后面(push_back),不过计算答案时要从后往前
        arr.insert(arr.begin(),n % 10);
        n /= 10;
    }
    for (int i = 0; i < arr.size(); i++) {//对于大于4的每位都要减1
        if (arr[i] > 4)
            arr[i]--;
    }
    int ans = 0;
    for (int i = 0; i < arr.size(); i++)//按9进制算出答案
        ans = ans * 9 + arr[i];
    cout << ans << endl;
    return 0;
}

#每日靠近华为offer一步#
全部评论
这里也可以这样看,他去掉了4,我们可以把数字当成九进制来算,把56789当做45678就可以了,比如100=1*9^2+0*9+0=81,17=1*9+6=15,5=4
3 回复 分享
发布于 07-19 06:44 四川
实际上就是找小于n并且包含4的有多少个数,直接一次构造出来然后判断
1 回复 分享
发布于 07-04 10:45 辽宁
淳桑的?
1 回复 分享
发布于 07-04 13:38 甘肃
n = int(input()) lst = [] while n > 0: n, x = divmod(n, 10) if x > 4: x -= 1 lst.append(x) ans = 0 for i, v in enumerate(lst): ans += v * pow(9, i) print(ans)
1 回复 分享
发布于 07-04 16:23 贵州
佬,这种题牛客有那种在线测评的吗?
点赞 回复 分享
发布于 07-07 18:21 黑龙江

相关推荐

oppo 市场管培 第一年27万,第三年50万左右
点赞 评论 收藏
分享
6 3 评论
分享
牛客网
牛客企业服务