2月23日(97-99题)

97.回文数2

题目描述

明明的问题可以归结为:给你一个整数(十进制),判断该整数的十进制数和它的二进制数是否全为回文数。

代码

cpp 复制代码
#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

//判断一个字符串是否为回文
bool isPalindrome(const string& s) {
    int left = 0;
    int right = s.length() - 1;
    while (left < right) {
        if (s[left] != s[right]) {
            return false; // 发现不对称的字符,不是回文
        }
        left++;
        right--;
    }
    return true; // 所有字符都对称,是回文
}

// 将十进制整数转换为二进制字符串
string toBinaryString(int n) {
    if (n == 0) return "0"; 
    
    string bin = "";
    while (n > 0) {
        bin += (n % 2 == 0 ? '0' : '1'); // 取余数拼接
        n /= 2;
    }
    // 除2取余法得到的顺序是反的,需要翻转过来
    reverse(bin.begin(), bin.end()); 
    return bin;
}

int main() {

    int n;
    while (cin >> n) {
        string decStr = to_string(n);      // 十进制形式
        string binStr = toBinaryString(n); // 二进制形式
        
        // 判断是否同时满足双回文条件
        if (isPalindrome(decStr) && isPalindrome(binStr)) {
            cout << "Yes\n";
        } else {
            cout << "No\n";
        }
    }
    
    return 0;
}

总结

转为十进制字符串 :可以直接使用 C++ 标准库中的 to_string(n) 函数,将整数转换为十进制字符串。

转为二进制字符串 :通过经典的"除 2 取余"法,将整数不断除以 2 并记录余数,最后将得到的字符序列反转即可得到正确的二进制字符串(注意特判 n = 0 的情况)。

回文判断:编写一个双指针函数,从字符串的头和尾同时向中间遍历。如果遇到不相等的字符则不是回文;如果顺利相遇则是回文。


98.最长的单词

给你一串正整数的连加表达式,完成这个表达式的计算。

代码

cpp 复制代码
#include <iostream>
#include <string>
#include <sstream>

using namespace std;

int main() {
    string line;
    // 逐行读取
    while (getline(cin, line)) {
        if (line.empty()) continue;

        stringstream ss(line);
        long long sum = 0;
        int num;
        char plus;

        // 首先读取第一个数字
        ss >> num;
        sum += num;

        // 然后循环读取 "+数字"
        while (ss >> plus >> num) {
            sum += num;
        }

        cout << sum << endl;
    }
    return 0;
}

总结

​ 不需要去手动计算 + 在哪个位置,也不需要用 substr 去切分字符串。只是把加号当成了输入判别之一。


99.构造序列

题目描述

根据题目描述中所描述的序列产生规则构造序列的前9项,然后告诉你一个正整数n,要求你输出序列的第n项。

代码

cpp 复制代码
#include <iostream>
#include <string>
#include <vector>

using namespace std;

// 生成第 n 轮的序列
string solve(int n) {
   string s = "11"; // 第1轮的基础序列
   if (n == 1) return s;

   // 从第2轮模拟到第n轮
   for (int r = 2; r <= n; ++r) {
       string next_s = "";
       // 遍历当前序列,检查相邻元素之和
       for (size_t i = 0; i < s.length() - 1; ++i) {
           next_s += s[i]; // 先将当前数字加入新序列
           
           // 将字符转换为数字进行计算
           int a = s[i] - '0';
           int b = s[i+1] - '0';
           
           // 规则:如果相邻两个数之和等于当前的轮数 r,则插入 r
           if (a + b == r) {
               next_s += to_string(r);
           }
       }
       next_s += s.back(); // 别忘了加上原序列的最后一个字符
       s = next_s; // 更新序列为下一轮做准备
   }
   return s;
}

int main() {
   int n;
   while (cin >> n) {
       cout << solve(n) << endl;
   }
   return 0;
}

总结


翻译

​ 计算机科学是对构成计算机(自动处理信息的设备)设计和使用基础的理论、实验和工程的研究。计算机科学的起源可以追溯到英国数学家查尔斯·巴贝奇(Charles Babbage)的工作,他于1837年首次提出了一种可编程的机械计算器。直到20世纪40年代电子数字计算机的出现,计算机科学通常才被视作一门独立于数学和工程学的学科。从那以后,它萌生了许多该学科独有的研究分支。

​ 在20世纪40年代末和50年代初,计算机科学领域的早期工作主要集中在自动化计算过程以供科学和工程使用。科学家和工程师开发了计算的理论模型,使他们能够分析不同方法在执行各种计算时的效率。在这段时间里,计算机科学与被称为数值分析的数学分支有很大的重叠,后者研究计算的准确性和精度。

​ 随着计算机的使用在20世纪50年代到70年代之间不断扩大,计算机科学的重点随之拓宽,涵盖了通过编程语言和操作系统来简化计算机的使用------编程语言是用于对计算机进行编程的人工语言,而操作系统是为计算机和用户之间提供有用接口的计算机程序。在此期间,计算机科学家还在尝试新的应用程序和计算机设计,创建了最初的计算机网络,并探索了计算与思维之间的关系。

sprouted: v. 发芽,长出,产生(原形 sprout)

discipline: n. 学科;纪律

automating: v. 使自动化(原形 automate)

相关推荐
hansang_IR2 小时前
【记录】AT_abc406模拟赛
c++·算法·模拟赛
blackicexs2 小时前
第六周第一天
数据结构·算法
52Hz1182 小时前
力扣20.有效的括号、155.最小栈
python·算法·leetcode
菜鸡儿齐2 小时前
leetcode-电话号码的字母组合
算法·leetcode·职场和发展
We་ct3 小时前
LeetCode 236. 二叉树的最近公共祖先:两种解法详解(递归+迭代)
前端·数据结构·算法·leetcode·typescript
小白菜又菜3 小时前
Leetcode 229. Majority Element II
算法·leetcode·职场和发展
Frostnova丶3 小时前
LeetCode 1461. 检查一个字符串是否包含所有长度为 K 的二进制子串
算法·leetcode·哈希算法
历程里程碑3 小时前
普通数组---合并区间
java·大数据·数据结构·算法·leetcode·elasticsearch·搜索引擎
Felven4 小时前
B. 250 Thousand Tons of TNT
算法