题目链接
题目描述
这是一个函数实现题。你需要实现一个 dotTime
(英文名直译为"点时间",但实际应为点积 dot product) 函数,该函数接收两个三维向量作为参数。
你的任务是计算这两个向量的点乘结果,并将其作为函数的返回值。
输入:
vector1
: 一个包含三个整数的数组/列表,表示第一个向量 (e.g.,[x1, y1, z1]
)。vector2
: 一个包含三个整数的数组/列表,表示第二个向量 (e.g.,[x2, y2, z2]
)。
示例:
- 输入:
[1, 1, 4]
,[5, 1, 4]
- 你的函数应返回:
22
- 说明:
1*5 + 1*1 + 4*4 = 5 + 1 + 16 = 22
。
解题思路
本题旨在考察对向量点积(或称内积、数量积)基本定义的理解和实现。对于两个三维向量 和
,它们的点积定义为:
[ \vec{a} \cdot \vec{b} = x_1x_2 + y_1y_2 + z_1z_2 ]
这是一个将两个向量映射到一个标量(即一个单独的数)的操作。
实现步骤非常简单:
- 从输入的两个数组/向量中,分别取出对应位置的元素。
- 将对应位置的元素相乘。
- 将所有乘积相加。
- 返回最终的和。
例如,对于输入 vector1
和 vector2
:
- 计算
vector1[0] * vector2[0]
- 计算
vector1[1] * vector2[1]
- 计算
vector1[2] * vector2[2]
- 将这三个结果相加即可。
由于向量维度固定为 3,所以这是一个固定次数的计算,无需循环。
数据范围考虑: 题目备注中提到坐标绝对值小于 1000。
- 单个乘积的最大值约为
1000 * 1000 = 1,000,000
。 - 总和的最大值约为
3 * 1,000,000 = 3,000,000
。 这个结果在标准的 32 位整型 (int
) 范围内,因此不需要使用long long
。
代码
注意:以下是你需要提交的全部内容,即在牛客网给定的模板中填写的代码。
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 计算两个三维向量的点乘结果
* @param vector1 int整型vector 第一个向量
* @param vector2 int整型vector 第二个向量
* @return int整型
*/
int dotTime(std::vector<int>& vector1, std::vector<int>& vector2) {
return vector1[0] * vector2[0] + vector1[1] * vector2[1] + vector1[2] * vector2[2];
}
};
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 计算两个三维向量的点乘结果
* @param vector1 int整型一维数组 第一个向量
* @param vector2 int整型一维数组 第二个向量
* @return int整型
*/
public int dotTime(int[] vector1, int[] vector2) {
int result = 0;
for (int i = 0; i < 3; i++) {
result += vector1[i] * vector2[i];
}
return result;
}
}
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 计算两个三维向量的点乘结果
# @param vector1 int整型一维数组 第一个向量
# @param vector2 int整型一维数组 第二个向量
# @return int整型
#
class Solution:
def dotTime(self, vector1, vector2):
# 使用zip将两个列表打包,然后用生成器表达式计算和
return sum(a * b for a, b in zip(vector1, vector2))
算法及复杂度
- 算法: 基本算术运算。
- 时间复杂度:
。因为向量的维度是固定的 3,所以计算点积所需的操作(3 次乘法和 2 次加法)是常数级别的。
- 空间复杂度:
。没有使用与输入大小相关的额外存储空间。