351判断回旋镖的存在、342充电时间总计算——题目思路与知识点总结 | 豆包MarsCode AI刷题

139 阅读5分钟

351判断回旋镖的存在、342充电时间总计算——题目思路与知识点总结C++ | 豆包MarsCode AI刷题

351判断回旋镖的存在

原问题

小M正在玩一个几何游戏,给定一个二维平面上的三个点 points,其中每个点用坐标 points[i] = [xi, yi] 表示。如果三点构成一个回旋镖,则返回 true。回旋镖的定义是三点不在一条直线上,并且这三个点互不相同。

请你帮助小M判断这些点是否构成一个回旋镖。

测试样例

样例1:

输入:points = [[1, 1], [2, 3], [3, 2]]
输出:True

样例2:

输入:points = [[1, 1], [2, 2], [3, 3]]
输出:False

样例3:

输入:points = [[0, 0], [1, 1], [1, 0]]
输出:True

问题解构

具体要求

根据给出的三个直角坐标,得到三个平面直角坐标系上的点,判断三个点是否在同一条直线上。

输入输出

输入:

3行2列的二维矩阵,代表三个点。

输出: 逻辑真或逻辑假。

题目类型分析

这是一道典型的数学编程题,主要考察数学的应用,以及将数学逻辑转换成代码的能力。

思路

判断三个点是否能够构成一个回旋镖,即可以通过判断任意两点构成的直线的斜率是否相等,如果相等,则不能构成回旋镖,如果不相等,则可以构成回旋镖。

代码逻辑

- 计算两条直线斜率
- 检查三点是否存在重合情况
- 检查是否在同一直线

代码

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

bool solution(vector<vector<int>>& points) {
    // write code here

    if (points.size()!= 3) {
        return false;
    }
    // 计算两条直线斜率

    double slope1 = ((double)(points[1][1] - points[0][1])) / ((double)(points[1][0] - points[0][0]));
    double slope2 = ((double)(points[2][1] - points[1][1])) / ((double)(points[2][0] - points[1][0]));

    // 检查三点是否存在重合情况
    if ((points[0][0] == points[1][0] && points[0][1] == points[1][1]) ||
        (points[0][0] == points[2][0] && points[0][1] == points[2][1]) ||
        (points[1][0] == points[2][0] && points[1][1] == points[2][1])) {
        return false;
    }

    // 检查是否在同一直线
    return abs(slope1 - slope2) > 1e-9;
}


int main() {
    vector<vector<int>> v1 = {{1, 1}, {2, 3}, {3, 2}};
    vector<vector<int>> v2 = {{1, 1}, {2, 2}, {3, 3}};
    vector<vector<int>> v3 = {{0, 0}, {1, 1}, {1, 0}};

    cout << (solution(v1) == true) << endl;
    cout << (solution(v2) == false) << endl;
    cout << (solution(v3) == true) << endl;
    return 0;
}

代码解释

因为斜率可能是带小数点的,所以用到double类型计算斜率。

因为是double类型,所以在返回时,不能苛求为0,而是应该判断是不是大于一个很小的数, 所以用是否大于十的负九次方来判断斜率是不是相等。

342充电时间总计算

原问题

小R有n部电脑,每部电脑的电池容量分别为ai。她可以使用两种不同的充电方式来给电脑充电:

  1. 普通充电:每单位时间为电脑充电x单位的电量。
  2. 闪充:每单位时间为电脑充电4x单位的电量。

现在,所有电脑的电量都为零。小R希望使用闪充给所有电脑充满电,计算她需要的总充电时间。请保留结果的小数点后两位。

测试样例

样例1:

输入:n = 4 ,x = 1 ,a = [2, 3, 4, 5]
输出:'3.50'

样例2:

输入:n = 3 ,x = 2 ,a = [4, 6, 8]
输出:'2.25'

样例3:

输入:n = 2 ,x = 1 ,a = [10, 5]
输出:'3.75'

问题解构

具体要求

输入一个有n个元素的数组,输入x,计算数组的和与4x相除的结果。

输入输出

输入int类型的n,x,元素个数为n的数组

输出字符串类型的计算结果

题目类型分析

字符串类型转换问题,难点不在数学计算,而在于字符串与数字类型转换。

思路

模块化,编写一个浮点数到字符串转换函数,然后进行正常数学计算。

代码逻辑

一层逻辑

  • 构建浮点数到字符串转换函数
  • 主函数

二层逻辑

  • 构建浮点数到字符串转换函数
    • 创建一个字符串流对象
    • 将浮点数格式化为固定小数点后两位,并写入字符串流
    • 将字符串流转换为字符串并返回
  • 主函数
    • 计算总充电量
    • 计算充电速度
    • 总量除以速度
    • 浮点数转化为字符串

代码

#include <iomanip>
#include <iostream>
#include <sstream>
#include <vector>
#include <string>

using namespace std;
// 构建浮点数到字符串转换函数
string floatToString(double value) {
    // 创建一个字符串流对象
    ostringstream stream;
    // 将浮点数格式化为固定小数点后两位,并写入字符串流
    stream << fixed << setprecision(2) << value;
    // 将字符串流转换为字符串并返回
    return stream.str();
}
// 主函数
string solution(int n, int x, vector<int> a) {
    // write code here
    string result;
    // 计算总充电量
    double sum = 0;
    for (int i = 0; i < n; i++) {
        sum += a[i];
    }
    // 计算充电速度
    double v = x * 4.0;
    // 总量除以速度
    double t = sum / v;
    // 浮点数转化为字符串
    result = floatToString(t);
    return result;
}

int main() {
    cout << (solution(4, 1, {2, 3, 4, 5}) == "3.50") << endl;
    cout << (solution(3, 2, {4, 6, 8}) == "2.25") << endl;
    cout << (solution(2, 1, {10, 5}) == "3.75") << endl;
    return 0;
}

代码解释

ostringstream类

ostringstream 是 C++ 标准库中的一个类,它是输出字符串流(output string stream)的简称,属于 <sstream> 头文件。ostringstream 类提供了一种将数据格式化为字符串的方式,类似于 ofstream 用于将数据输出到文件,或者 cout 用于将数据输出到控制台。不同的是,ostringstream 会将输出的数据保存到一个字符串中。

主要特点:

  • ostringstream 允许你将各种类型的数据(如整数、浮点数、字符等)以指定的格式转换为字符串,并且该字符串可以通过 str() 成员函数进行访问。
  • 它可以通过流操作符(<<)将数据写入字符串流,并且能够像处理标准输出流一样处理不同类型的数据。
  • 通过 ostringstream,你可以灵活地控制数据的格式,例如对浮点数进行设置精度,或者使用宽度、对齐等功能。