分割数字并排序(字符串)-基础题103th + A == B ?(字符串)-基础题104th + 母牛制造的回文(字符串)-基础题105th

分割数字并排序

属于字符串的内容

题目

  • 问题描述

    输入一行数字,如果我们把这行数字中的'5'都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以'0'开头,这些头部的'0'应该被忽略掉,除非这个整数就是由若干个'0'组成的,这时这个整数就是0)。

    你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。

  • 输入说明

    输入包含多组测试用例,第一行,测试案例个数,每组输入数据只有一行数字(数字之间没有空格),这行数字的长度不大于1000。

    输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由'5'组成。

  • 输出说明

    对于每个测试用例,输出分割得到的整数排序的结果,相邻的两个整数之间用一个空格分开,每组输出占一行。

  • 输入范例

    2
    0051231232050775
    4000050005045453356356456454564567677686564654

  • 输出范例

    0 77 12312320
    0 4 4 4 4 33 63 64 64 64 646 40000 67677686

解题思路

  • 本题思路是利用字符串扫描与分割的方法进行处理。首先将输入的一整行数字字符串从左到右遍历,把字符'5'视为分隔符,当遇到'5'时,就把当前已经收集到的数字片段作为一个整数保存;如果连续出现多个'5',则说明中间没有有效数字,需要跳过。对于得到的每个数字片段,需要去除前导零(可以直接转换为整数,或手动删除前导'0',但如果该片段全为0,则结果应为0)。将所有分割得到的整数存入容器中后,对其按从小到大的顺序排序,最后按空格分隔输出即可。

整体代码

cpp 复制代码
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

int main() {
    int T;
    cin >> T;
    while (T--) {
        string s;
        cin >> s;

        vector<int> nums;
        string temp = "";

        for (int i = 0; i < s.length(); i++) {
            if (s[i] == '5') {
                // 遇到分隔符,处理当前数字
                if (!temp.empty()) {
                    nums.push_back(stoi(temp)); // 自动去除前导0
                    temp.clear();
                }
            } else {
                temp += s[i];
            }
        }

        // 处理最后一个数字
        if (!temp.empty()) {
            nums.push_back(stoi(temp));
        }

        // 排序
        sort(nums.begin(), nums.end());

        // 输出
        for (int i = 0; i < nums.size(); i++) {
            if (i) cout << " ";
            cout << nums[i];
        }
        cout << endl;
    }

    return 0;
}

注意事项

  • 注意遇到'5'时要立即处理当前缓存的数字,连续多个'5'时不要加入空数字。

A = = B ?

属于字符串的内容

题目

  • 问题描述
    给你两个非负实数A和B,如果A等于B,输出 "YES", 否则输出"NO"

  • 输入说明
    第一行N,表示有N组测试数据。
    以下N行,每行两个非负实数 A和B。每个实数不超过1000位,且可能在前面和后面有0存在。

  • 输出说明
    对于每组测试数据,如果A和B相等则输出 "YES", 否则输出 "NO"。
    每组测试数据占一行,两组测试数据之间无空行。行首与行尾均无空格。

  • 输入范例

    2
    100.0 00100
    0100.1234576 00000000100.123457

  • 输出范例

    YES
    NO

解题思路

  • 本题思路是利用字符串规范化的方法进行比较。由于实数长度可能达到1000位,不能直接转换为浮点数,否则会产生精度问题,因此需要按字符串处理。对于每个输入的实数,先将其分为整数部分和小数部分:如果没有小数点,则小数部分视为空。然后对整数部分去除前导零(若全部为零则保留一个"0"),对小数部分去除末尾的多余零(若去除后为空则表示没有小数部分)。经过规范化后,再将整数部分和小数部分重新组合(如整数部分 + '.' + 小数部分,若小数部分为空则只保留整数部分)。最后比较两个规范化后的字符串是否相同,相同输出"YES",否则输出"NO"。

整体代码

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;

// 将数字字符串规范化
string normalize(string s) {
    // 查找小数点
    int pos = s.find('.');
    string intPart, fracPart;

    if (pos == string::npos) {
        intPart = s;
        fracPart = "";
    } else {
        intPart = s.substr(0, pos);
        fracPart = s.substr(pos + 1);
    }

    // 去除整数部分前导0
    int i = 0;
    while (i < intPart.size() && intPart[i] == '0') i++;
    intPart = intPart.substr(i);
    if (intPart.empty()) intPart = "0";

    // 去除小数部分末尾0
    int j = fracPart.size() - 1;
    while (j >= 0 && fracPart[j] == '0') j--;
    if (j >= 0)
        fracPart = fracPart.substr(0, j + 1);
    else
        fracPart = "";

    // 重新组合
    if (fracPart.empty())
        return intPart;
    else
        return intPart + "." + fracPart;
}

int main() {
    int N;
    cin >> N;
    while (N--) {
        string A, B;
        cin >> A >> B;

        if (normalize(A) == normalize(B))
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }
    return 0;
}

注意事项

  • 注意数据长度可达1000位,使用 double 或 long double 会丢失精度。

母牛制造的回文

属于字符串的内容

题目

  • 问题描述
    据说如果你给无限只母牛和无限台巨型便携式电脑(有非常大的键盘),那么母牛们会制造出世上最棒的回文。你的工作就是去这些牛制造的奇观(最棒的回文)。在寻找回文时不用理睬那些标点符号、空格(但应该保留下来以便做为答案输出),只用考虑字母'A'-'Z'和'a'-'z'。要你寻找的最长的回文的文章是一个不超过20,000个字符的字符串。我们将保证最长的回文不会超过2,000个字符(在除去标点符号、空格之前)。

  • 输入说明
    一个不超过20,000个字符的文件。

  • 输出说明
    输出的第一行应该包括找到的最长的回文的长度。
    下一个行或几行应该包括这个回文的原文(没有除去标点符号、空格), 把这个回文输出到一行或多行(如果回文中包括换行符)。如果有多个回文长度都等于最大值,输出那个前出现的。

  • 输入范例

    Confucius say: Madam, I'm Adam.

  • 输出范例

    11
    Madam, I'm Adam

解题思路

-本题思路是先进行字符过滤与位置映射,再利用回文中心扩展算法寻找最长回文。由于判断回文时只考虑字母且不区分大小写,但最终输出需要保留原文中的标点、空格和大小写,因此可以先遍历原字符串,将所有字母按顺序提取出来并统一转换为小写,同时记录每个字母在原字符串中的位置。然后在这个只包含字母的新字符串上,采用"中心扩展法",分别以每个字符为奇数长度中心、相邻两个字符为偶数长度中心,向两侧扩展判断是否为回文,并记录最长回文的起止位置。得到最长回文在过滤字符串中的范围后,通过之前保存的位置映射,找到其在原字符串中的起始和结束位置,最后按原样截取并输出该子串,同时输出其字母长度。如果存在多个最长回文,中心扩展按顺序扫描即可保证输出最先出现的那个。

整体代码

cpp 复制代码
#include <iostream>
#include <string>
#include <vector>
#include <cctype>
using namespace std;

int main() {
    // 读取全部输入(可能包含换行)
    string line, text;
    while (getline(cin, line)) {
        text += line;
        text += '\n';
    }
    if (!text.empty()) text.pop_back(); // 去掉最后多加的换行

    // 过滤出字母并记录原位置
    string letters;
    vector<int> pos; // letters中每个字符在原串中的位置
    for (int i = 0; i < text.size(); i++) {
        if (isalpha(text[i])) {
            letters += tolower(text[i]);
            pos.push_back(i);
        }
    }

    int n = letters.size();
    int bestLen = 0;
    int bestL = 0, bestR = 0;

    // 中心扩展法
    for (int center = 0; center < n; center++) {
        // 奇数长度
        int l = center, r = center;
        while (l >= 0 && r < n && letters[l] == letters[r]) {
            if (r - l + 1 > bestLen) {
                bestLen = r - l + 1;
                bestL = l;
                bestR = r;
            }
            l--; r++;
        }

        // 偶数长度
        l = center;
        r = center + 1;
        while (l >= 0 && r < n && letters[l] == letters[r]) {
            if (r - l + 1 > bestLen) {
                bestLen = r - l + 1;
                bestL = l;
                bestR = r;
            }
            l--; r++;
        }
    }

    // 根据位置映射回原字符串
    int origL = pos[bestL];
    int origR = pos[bestR];

    cout << bestLen << endl;
    cout << text.substr(origL, origR - origL + 1) << endl;

    return 0;
}

注意事项

  • 注意只用于判断的字符是字母:需使用 isalpha() 过滤,忽略空格、标点、数字等。

英文段落翻译

自己翻译

3.人工智能

人工智能研究旨在使计算机和机器能够模仿人类智能和感觉处理能力,并且使用计算机模式化人类行为以便提升我们对于智能的理解。人工智能的许多分支包括机器学习,推理,识别,知识表现,问题解决,基础事例原因,自然语言理解,语言识别,计算机视觉以及人工神经网络。

4.机器人学

已经开创了宽泛实际应用的计算机科学的另一个领域是计算机学--计算机控制机械设备的设计和开发。机器人的范围是复杂的,从玩具到自动化工厂组装线以及把人类从冗余的重复的或者危险的任务中解放。机器人也应用在要求速度,精确性,连续性或者清洁性的那些超过了人类可以完成的地方。机器人专家--致力于机器人学领域的科学家--研究控制机器人的许多方面。这些方面包括模型化机器人的物理属性,模型化它的环境,计划它的行动,高效的指导他的机械,使用传感器来提供对控制项目的反馈,以及确保它的行为的安全。专业学习简化控制项目的创造的方式。尝试给机器人提供更多人类的灵巧和调节性,并且用AI进行辅助是研究的一个领域。

5.人机交互

人机交互给人类提供了使用计算机的方式。一个人机交互的例子是键盘,它让人类输入命令进入一个计算机并且输入文本进入一个特定的程序。在人机交互领域的研究的多样性与计算机使用者和应用的多样性息息相关。然而,一个统一的主题是更好的界面的开发和有效性的实验性评估。例子包括为残疾人提升计算机的可用性,简化项目使用,为虚拟现实开发三维输入和输出设备,提升手写和语音识别,以及为飞行器设备在至关重要的信息例如速度高度和在飞行员前面的窗口展示一个屏幕开发前导显示器。研究的一个领域叫做可视化,被视为图形化展示大量的数据,以便人类能够领会它的关键属性。

AI翻译

3 . 人工智能

人工智能研究旨在使计算机与机器能够模拟人类的智能及感官处理能力,并通过计算机对人类行为进行建模,以加深我们对智能本身的理解。人工智能研究的众多分支包括:机器学习、推理、认知、知识表示、问题求解、基于案例的推理、自然语言理解、语音识别、计算机视觉以及人工神经网络。

4 . 机器人学

计算机科学中另一个已获得广泛实际应用的领域是机器人学------即对计算机控制的机械装置进行设计与开发。机器人的复杂度从玩具到自动化工厂装配线不一而足,它们使人类从乏味、重复或危险的任务中解脱出来。在速度、精度、一致性或洁净度要求超出人类能力范围的场合,机器人亦被广泛采用。机器人学家------即从事机器人学领域的科学家------研究控制机器人的诸多方面。这些方面包括:对机器人的物理特性进行建模、对其环境进行建模、规划其动作、高效地指挥其机械机构、利用传感器为控制程序提供反馈,以及确保其行为的安全性。他们还研究简化控制程序创建的方法。其中一个研究领域致力于赋予机器人更多人类的灵巧性与适应性,该领域与人工智能密切相关。

5 . 人机交互

人机交互为人们使用计算机提供了途径。人机交互的一个例子是键盘,它让人类能够向计算机输入指令,并向特定应用程序输入文本。人机交互研究的多样性,恰与计算机用户及应用场景的多样性相对应。然而,该领域一个统一的主题是开发更优质的交互界面,并通过实验评估其有效性。相关实例包括:改善残障人士的计算机使用体验、简化程序操作、为虚拟现实开发三维输入输出设备、改进手写与语音识别技术,以及为飞机仪表开发平视显示器------即速度、高度、航向等关键信息被显示在飞行员座舱前方的屏幕上。可视化是其中的一个研究领域,它关注如何以图形方式呈现海量数据,以便人们能够理解其关键特性。

单词打卡

下一篇

待续

相关推荐
fengfuyao9851 小时前
基于局部均值分解(LMD)的MATLAB信号分解程序实现
算法·matlab·均值算法
问好眼2 小时前
《算法竞赛进阶指南》0x01 位运算-4.最短Hamilton路径
c++·算法·动态规划·位运算·信息学奥赛
苦藤新鸡2 小时前
65.搜索平移数组的最小值
算法·leetcode
载数而行5202 小时前
算法系列5之交换排序
c语言·数据结构·c++·算法·排序算法
重生之后端学习2 小时前
35. 搜索插入位置
java·数据结构·算法·leetcode·职场和发展·深度优先
程序员南飞2 小时前
算法笔试-求一个字符串的所有子串
java·开发语言·数据结构·python·算法·排序算法
陆嵩2 小时前
从一个小例子实践代数多重网格方法
算法·amg·多重网格·粗化·插值算子·光滑·v cycle
清水白石0082 小时前
模板方法模式全解析:用抽象基类定义算法骨架,让子类优雅填充细节
数据库·python·算法·模板方法模式
DeepModel2 小时前
【分类算法】C4.5分类算法超详细讲解
算法·决策树·回归