问题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 正在研究一种特殊的兔子品种的繁殖模式。这种兔子的繁殖遵循以下规律:
- 每对成年兔子每个月会生育一对新的小兔子(一雌一雄)。
- 新生的小兔子需要一个月成长,到第二个月才能开始繁殖。
- 兔子永远不会死亡。
小 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;
}