科大讯飞笔试题---删除数字

1、

题目描述:
给定一个长度为 n 的数组,数组元素为 a1, a2, . . , an,每次能删除任意 a 的任意一位,求将所有数字变成 0 最少需要几步。例如 103 若删除第 1 位则变成 3; 若删除第 2 位则变成13; 若删除第 3 位则变成 10。
输入
输入描述第一行一个正整数 n 代表数组长度。接下来一行 n 个数第 j 个数代表 a。
输出
输出一行一个数代表答案。
样例输入
5
10 13 22 100 30
样例输出
7
提示
数据范围:
1 ≤ n ≤ 10^5
0< ai< 10^9

2、解答

#include <iostream>
#include <vector>
#include <sstream> // 用于字符串流           
int main()
{
	int n, count = 0;
    std::string line;
    std::cin >> n;
    std::cin.ignore();//忽略换行符,拿到下一行数据
    std::vector<int> data;

    std::getline(std::cin, line); // 读取一整行

    // 使用字符串流来解析这行数据
    std::istringstream iss(line);
    int number;
    while (iss >> number) { // 当字符串流中还有整数时,继续读取
        data.push_back(number); // 将读取的整数添加到向量中
    }

    for (int j = 0; j < n; j++)
    {
        if (data[j] == 0)
            continue;
        if (data[j] / 1000000000)
        {
            data[j] = data[j] % 1000000000;
            count++;
        }
            
        if (data[j] / 100000000)
        {
            data[j] = data[j] % 100000000;
            count++;
        }
        if (data[j] / 10000000)
        {
            data[j] = data[j] % 10000000;
            count++;
        }
        if (data[j] / 1000000)
        {
            data[j] = data[j] % 1000000;
            count++;
        }
        if (data[j] / 100000)
        {
            data[j] = data[j] % 100000;
            count++;
        }
        if (data[j] / 10000)
        {
            data[j] = data[j] % 10000;
            count++;
        }
        if (data[j] / 1000)
        {
            data[j] = data[j] % 1000;
            count++;
        }
        if (data[j] / 100)
        {
            data[j] = data[j] % 100;
            count++;
        }
        if (data[j] / 10)
        {
            data[j] = data[j] % 10;
            count++;
        }
        if (data[j])
            count++;
    }
    std::cout << count << std::endl;
    return 0;
}

关键代码

代码段中,使用了 std::getline 来从标准输入读取一整行数据,然后使用 std::istringstream 来解析这行数据中的整数,并将它们存储到一个 std::vector<int> 容器中。这是一个常见的模式,用于处理和转换由空格分隔的输入数据。下面是对每个步骤的详细解释:

std::getline(std::cin, line); // 读取一整行
  • 这行代码使用 std::getline 函数从标准输入(通常是键盘输入)读取一整行文本,并将其存储在字符串变量 line 中。这种方法可以读取包含空格的整行输入,直到遇到换行符。
std::istringstream iss(line);
  • 创建了一个 std::istringstream 对象 iss,并用之前从标准输入读取的字符串 line 初始化它。std::istringstream 是从 <sstream> 头文件中提供的一个类,它允许我们将字符串作为流来处理,这样可以使用类似于从文件或标准输入读取的方式来从字符串中提取数据。
int number;
while (iss >> number) { // 当字符串流中还有整数时,继续读取
  • 在这个循环中,iss >> number 尝试从 iss 字符串流中提取一个整数到变量 number 中。如果成功,表达式的结果为 true,循环继续。如果遇到非整数数据或流结束,表达式结果为 false,循环停止。
    data.push_back(number); // 将读取的整数添加到向量中
}
  • 每次循环时,如果成功从流中读取了一个整数,就使用 push_back 方法将这个整数添加到 std::vector<int> 类型的向量 data 中。这样,所有从输入行中读取的整数都会被依次存储在 data 向量中。

这种方法非常适合于处理和解析由空格分隔的整数输入,可以灵活地应用于多种需要从文本行中提取多个数据项的场景。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值