青训营X豆包MarsCode 技术训练营 字节青训营笔记1| 豆包MarsCode AI刷题

113 阅读4分钟

问题1:RGB色值转换为整数值

问题描述

小M需要一个函数,用于将RGB颜色值转换为相应的十六进制整数值。RGB色值以字符串的形式给出,如"rgb(192, 192, 192)",需要转换为对应的整数值。

测试样例

样例1:

输入:rgb = "rgb(192, 192, 192)" 输出:12632256

样例2:

输入:rgb = "rgb(100, 0, 252)" 输出:6553852

样例3:

输入:rgb = "rgb(33, 44, 55)" 输出:2174007

样例4:

输入:rgb = "rgb(255, 255, 255)" 输出:16777215

样例5:

输入:rgb = "rgb(0, 0, 0)" 输出:0

问题分析

step1:

RGB色值以字符串的形式给出,如"rgb(192, 192, 192)",对应的位置是"rgb(R, G, B)"

step2:

颜色通常使用RGB三种颜色的组合来表示,R代表红色、G代表绿色、B代表蓝色,其中每种颜色的值范围是从 0 到 255。

RGB 的每个分量R、G、B可以用一个字节8位来表示,每个分量占据 1 字节的内存空间。

2^8=256,因此,提取出来R,G,B之后,最高字节R2^82^8,中间字节G*2^8,最低字节B。

可以得到计算公式为 result16进制 = R256256 + G*256 + B。

std::sscanf函数 按照给定的格式将字符串解析为 r, g, 和 b 对应的整数值,rgb 是一个 std::string 类型的字符串。

#include <iostream>
#include <string>
#include <sstream>

int solution(std::string rgb) {
    int R, G, B;
    std::sscanf(rgb.c_str(), "rgb(%d, %d, %d)", &R, &G, &B);
    return R*256*256 + G*256 + B;
}

int main() {
    std::cout << (solution("rgb(192, 192, 192)") == 12632256) << std::endl;  
    std::cout << (solution("rgb(100, 0, 252)") == 6553852) << std::endl;      
    std::cout << (solution("rgb(33, 44, 55)") == 2174007) << std::endl;     
    return 0;
}

那是不是可以采用左移移位的方法呢,可以,应该是这样的(R<<16) | (G<<8) | B。

#include <iostream>
#include <string>

int solution(std::string rgb) {
    int r, g, b;
    std::sscanf(rgb.c_str(), "rgb(%d, %d, %d)", &R, &G, &B);
    return (R<<16) | (G<<8) | B;
}

int main() {
    std::cout << (solution("rgb(192, 192, 192)") == 12632256) << std::endl;
    std::cout << (solution("rgb(100, 0, 252)") == 6553852) << std::endl;
    std::cout << (solution("rgb(33, 44, 55)") == 2174007) << std::endl;
    return 0;
}

问题2:兔群繁殖之谜

问题描述

生物学家小 R 正在研究一种特殊的兔子品种的繁殖模式。这种兔子的繁殖遵循以下规律:

  1. 每对成年兔子每个月会生育一对新的小兔子(一雌一雄)。
  2. 新生的小兔子需要一个月成长,到第二个月才能开始繁殖。
  3. 兔子永远不会死亡。

小 R 从一对新生的小兔子开始观察。他想知道在第 A 个月末,总共会有多少对兔子。

请你帮助小 R 编写一个程序,计算在给定的月份 A 时,兔子群体的总对数。

注意:

  • 初始时有 1 对新生小兔子。
  • 第 1 个月末有 1 对兔子:原来那对变成了成年兔子,并开始繁殖。
  • 第 2 个月末有 2 对兔子:原来那 1 对成年兔子,繁殖了 1 对新生的小兔子。
  • 从第 3 个月开始,兔子群体会按照上述规律增长。

输入

一个整数 A(1 ≤ A ≤ 50),表示月份数。

返回

一个长整数,表示第 A 个月末兔子的总对数。

测试样例

样例1:

输入:A = 1 返回:1

样例2:

输入:A = 5 返回:8

样例3:

输入:A = 15 返回:987

问题分析

这个是典型简单的动态规划问题

#include <iostream>

long long solution(int n) {
    if (n == 1) return 1; // 第 1 个月兔子对数
    if (n == 2) return 2; // 第 2 个月兔子对数

    long long a = 1, b = 2; 
    for (int i = 3; i <= n; i++) {
        long long c = a + b;
        a = b;
        b = c;
    }
    return b;
}

int main() {
    std::cout << (solution(1) == 1) << std::endl;   
    std::cout << (solution(5) == 8) << std::endl;   
    std::cout << (solution(15) == 987) << std::endl; 
    return 0;
}