《热题100》字符串、双指针、贪心算法篇
思路:对于输入的的字符串,只有三种可能,ipv4,ipv6,和neither
ipv4:四位,十进制,无前导0,小于256
ipv6:八位,十六进制,无多余0(00情况不允许),不为空
class Solution:
def solve(self , IP: str) -> str:
if '.' in IP: #有可能是IPV4
res = IP.split('.')
if len(res) == 4: #满足4位
for i in res:
try: #满足十进制
a = int(i)
except:
return "Neither"
else:
if len(str(int(i))) != len(i): #前导0判断
return "Neither"
elif int(i) > 255: #255判断
return "Neither"
return "IPv4" #如果没有提前盘错退出,就一定是IPV4
else:
return "Neither"
elif ':' in IP: #有可能是IPV6
res = IP.split(':')
if len(res) == 8: #满足8位
for i in res:
try: #满足16进制
a = int(i,16)
except:
return "Neither"
if i == '' or i.count('0') == len(i) and len(i) != 1 or len(i) > 4: #非空,16比特,0不多余
return "Neither"
return "IPv6"
else:
return "Neither"
else:
return "Neither"
思路:让两个指针i j,分别从两个字符串的最后一位开始向前遍历,设置进位ind,当i j都没有走到-1时,如果当前和a = i+j+ind大于9,那就res.insert(0,a-10),将ind置为1,如果当前和小于等于9,res.insert(0,a),将ind置为0.
跳出循环之后,将剩余的部分和ind继续加和,如果没有剩余,ind为1,就把ind insert到首位。
class Solution:
def solve(self , s: str, t: str) -> str:
ind = 0 #进位
i,j = len(s)-1,len(t)-1
res = []
while i >= 0 and j >= 0:
a = int(s[i]) + int(t[j]) + ind
if a <= 9:
res.insert(0,str(a))
ind = 0
else:
ind = 1
res.insert(0,str(a-10))
i -= 1
j -= 1
if i == -1:
while j >= 0: 继续遍历剩下的
a = int(t[j]) + ind
if a <= 9:
res.insert(0,str(a))
ind = 0
else:
ind = 1
res.insert(0,str(a-10))
j -= 1
if j == -1:
while i >= 0: 继续遍历剩下的
a = int(s[i]) + ind
if a <= 9:
res.insert(0,str(a))
ind = 0
else:
ind = 1
res.insert(0,str(a-10))
i -= 1
if i == -1 and j == -1 and ind != 0: #还有进位
res.insert(0,str(ind))
return ''.join(res)
思路:先将区间按照start进行排序(从小到大),从前往后遍历区间[1,len-1],当前区间和前面的区间比较,有三种可能:当前区间被前面的区间完全覆盖,当前区间start在前一个区间内,end超出了前一个区间。这两种情况都可以直接更新当前的区间i.start = min(i-1.start,i.start),i.end = max(i-1.end,i,end)。最后一种情况是当前区间的start比前一个区间的end大,两个区间不重复,这种情况下就把前一个区间加入res中。(前一个区间是合并后的)。在最后将最后一个区间加入res。
class Solution:
def merge(self , intervals: List[Interval]) -> List[Interval]:
intervals = sorted(intervals,key=lambda x: x.start) #排序
res = []
if len(intervals) <= 1: #特殊判断
return intervals
i = 1
while i < len(intervals):
if intervals[i].start <= intervals[i-1].end: #更新区间
intervals[i].start = min(intervals[i-1].start,intervals[i].start)
intervals[i].end = max(intervals[i-1].end,intervals[i].end)
else: #加入res
res.append(intervals[i-1])
i += 1
res.append(intervals[len(intervals)-1])
return res
思路:用双指针(滑动窗口)和哈希表来做。首先进行特殊判断:如果len(T)>len(S)或者len(T)是空或者len(S)是空,以及T中有元素不在S中,都要输出空。
然后left=0,right=1开始遍历字符串,如果当前S[left:right]包含的每一个key(T中的字符串)的数量都大于等于d[key],就找到了一个符合的子串,left+=1,查看答案ans与right-left+1比较大小,如果小就更新ans。如果窗口不符合,先判断right是否到达了len(S),如果没到达就更新right+=1,到达后,就更新left+=1来改变窗口。
import collections
class Solution:
def minWindow(self , S: str, T: str) -> str:
d1 = collections.Counter(S) #都改成哈希表查找会更快
d2 = collections.Counter(T)
res = [i for i in d2 if i not in d1]
if len(res) or len(S) == 0 or len(T) == 0 or len(T) > len(S): #特殊判断
return ''
left,right = 0,1
ans = S #答案最开始用较长字符串表示
while right > left:
if all(S[left:right].count(key) >= d2[key] for key in d2): #符合的子串窗口出现
if right-left+1 <= len(ans): #判断与答案的大小
ans = S[left:right]
left += 1 #更新窗口
else:
if right < len(S):
right += 1
else:
left += 1
return ans
思路:双指针,滑动窗口,如果当前arr[right]在arr[left:right]中,就更新答案,然后移动左指针,如果不在,就移动右指针。最后要考虑一个情况,就是right一直不在,到len(arr)-1后退出循环,所以在返回前,要再次更新ans = max(ans,right-left)。
class Solution:
def maxLength(self , arr: List[int]) -> int:
if len(arr) <= 1:
return len(arr)
left,right = 0,1
ans = 0
while right < len(arr):
if arr[right] not in arr[left:right]:
right += 1
else:
ans = max(ans,right-left)
left += 1
ans = max(ans,right-left)
return ans
思路:使用贪心算法求解,我们想要求最大的面积,所以要么底边比较大,要么高度高。用相对指针先保证底边最大,然后向里移动,每次移动较小的值,保证长边被保留下来。每次都计算area,并且更新ans。
class Solution:
def maxArea(self , height: List[int]) -> int:
if len(height) < 2: #特殊情况判断
return 0
area = 0
ans = 0
left,right = 0,len(height)-1 #相对指针
while left < right:
area = (right-left)*(min(height[left],height[right])) #计算面积更新答案
ans = max(ans,area)
if height[left] < height[right]: #每次都移动较小的边长
left += 1
else:
right -= 1
return ans
思路:相向双指针,先确定两个边界p1,p2,移动较小边界,如果当前值小于该边界,ans+=差值。如果大于,就更新边界。当left == right时退出
class Solution:
def maxWater(self , arr: List[int]) -> int:
if len(arr) <= 2: #特殊判断
return 0
left,right = 0,len(arr)-1 #相向双指针
ans = 0
p1,p2 = arr[left],arr[right] #设置边界
while left < right:
if p1 < p2: #移动较小的边界
left += 1
if p1 >= arr[left]: #如果当前边界大于当前值,更新ans
ans += p1 - arr[left]
else: #否则更新边界
p1 = arr[left]
else:
right -= 1
if p2 >= arr[right]:
ans += p2 - arr[right]
else:
p2 = arr[right]
return ans
思路:用dp存储每个孩子的糖数,初始化为1,遍历第一遍(从左到右),如果i > i-1那么更新dp[i] = dp[i-1]+1。然后遍历第二遍,如果i > i+1那么更新dp[i] = dp[i+1]+1。最后计算dp的和。
class Solution:
def candy(self , arr: List[int]) -> int:
if len(arr) <= 1: #特殊判断
return len(arr)
dp = [1]*len(arr) #初始化
for i in range(1,len(arr)): #第一次遍历,如果右边比左边大,就更新dp
if arr[i] > arr[i-1]:
dp[i] = dp[i-1] + 1
for i in range(len(arr)-2,-1,-1): #第二次遍历,如果左边比右边大,而且左边的糖果比右边小
if arr[i] > arr[i+1] and dp[i] <= dp[i+1]:
dp[i] = dp[i+1] + 1
return sum(dp)
class Solution:
def minmumNumberOfHost(self , n: int, startEnd: List[List[int]]) -> int:
if n <= 1:
return n
start = [i[0] for i in startEnd]
end = [i[1] for i in startEnd]
start.sort() #排序
end.sort()
j = 0
res = 0
for i in range(n):
if start[i] >= end[j]: #开始的时间比上一个结束的时间大
j += 1
else:
res += 1
return res
我们是要看有没有区间重叠,如果当前增加了主持人,就可以多一个开始时间,但是依旧要看新的开始时间是否和之前的结束时间重叠。(所以增加主持人的时候j不动)
class Solution:
def solve(self , n: int, m: int, a: List[int]) -> List[int]:
if m % n == 0:
return a
else:
x = m%n
a = a[n-x:] + a[:n-x]
return a
思路:设置上下左右的边界值,然后开始遍历,从左到右遍历一次,更新up的值,然后判断当前是否还有行:up <= down,然后从上到下遍历,更新right值,之后判断当前时候还有列:left <= right。接着从右往左遍历,更新下边界值,从下往上遍历更新左边界值。跳出循环的条件是左>右,上>下。
class Solution:
def spiralOrder(self , matrix: List[List[int]]) -> List[int]:
n = len(matrix)
if n <= 0:
return []
m = len(matrix[0])
if m <= 0:
return []
ans = []
up,down,left,right = 0,n-1,0,m-1 #设置边界值
while up <= down and left <= right:
#从左到右
for i in range(left,right+1):
ans.append(matrix[up][i])
up += 1 #更新上边界
#从上到下
if up <= down: #保证还有行
for i in range(up,down+1):
ans.append(matrix[i][right])
right -= 1 #更新右边界
if left <= right: #保证还有列
#从右到左
for i in range(right,left-1,-1):
ans.append(matrix[down][i])
down -= 1 #更新下边界
#从下到上
for i in range(down,up-1,-1):
ans.append(matrix[i][left])
left += 1 #更新左边界
return ans
思路:取第一列元素,反转之后作为新数组的第一行。
class Solution:
def rotateMatrix(self , mat: List[List[int]], n: int) -> List[List[int]]:
res = []
m = len(mat[0]) #列
for i in range(m): #遍历列
a = []
for j in range(n): #遍历行
a.append(mat[j][i])
res.append(a[::-1])
return res
思路:最近最少使用一般用链表或者栈来实现,如果访问或者更新键值对的时候,就先把原来的删掉,把key插入到队头,每次队满之后,直接pop掉队尾。
class Solution:
def __init__(self, capacity: int):
self.res = {} #存储键值对
self.lenght = capacity #缓存结构大小
self.stack = [] #存储键值对的使用频率
def get(self, key: int) -> int:
if key in self.res: #如果key在缓存中,更新stack,然后返回value
self.stack.remove(key)
self.stack.insert(0,key)
return self.res[key]
else: #否则返回0
return -1
def set(self, key: int, value: int) -> None:
if key in self.res: #如果key值在缓存中,更新缓存值,然后更新stack
self.res[key] = value
self.stack.remove(key)
self.stack.insert(0,key)
else: #不在要新增数据
if len(self.stack) == self.lenght: #如果当前缓存满了
a = self.stack.pop() #弹出栈顶
del self.res[a] #删除缓存
self.stack.insert(0,key) #更新stack和res
self.res[key] = value
思路:两个哈希表。key_freq = {key:freq}存储出现的key的次数。缓存cache = {freq:{key:value}}
然后使用minfreq来记录当前的最小次数,如果当前的freq==minfreq并且cache中这个freq的长度已经为0,此时更新最小minfreq+1.
这里要用到两个colletions的内置字典,defaultDict和orderedDict。oderedDict是按照key的插入顺序对key进行的排序。可以pop(key),popitem(last = False)将会弹出第一个key,这个就是最小的使用频率下最久不适用的键值。默认是last = True
弹出最后一个键值对。
import collections
class LFU:
def __init__(self,k) -> None:
self.key_freq={} # 记录key值和当前key出现的频率
self.cache=collections.defaultdict(collections.OrderedDict)# 出现频率:{key:value}
self.lenght = k
self.minfreq = 0 #当前最小频率
def set(self,key,value):
if key in self.key_freq: #存在就更新值,使用次数增加
freq = self.key_freq[key] #取该key的出现频率
self.cache[freq].pop(key) #在cache对应的频率中删除这个key
self.key_freq[key] += 1 #频率加一
self.cache[freq+1][key] = value #修改cache,让频率+1的键值放入键值对
if self.minfreq == freq and len(self.cache[freq]) == 0: #是否要修改最小频率
self.minfreq += 1
else:
if self.lenght == len(self.key_freq): #已满,淘汰
delkey,delvalue = self.cache[self.minfreq].popitem(last=False) #删第一个键值对
self.key_freq.pop(delkey)
#插入
self.key_freq[key] = 1 #第一次出现
self.cache[1][key] = value
self.minfreq = 1
def get(self,key):
if key in self.key_freq:
freq = self.key_freq[key]
val = self.cache[freq].pop(key)
self.key_freq[key] += 1
self.cache[freq+1][key] = val
if freq == self.minfreq and len(self.cache[freq])==0: #修改最小频率
self.minfreq += 1
return val
else:
return -1
class Solution:
def LFU(self , operators: List[List[int]], k: int) -> List[int]:
ans = []
a = LFU(k)
for i in operators:
if i[0] == 1:
a.set(i[1],i[2])
else:
ans.append(a.get(i[1]))
return ans
相关文章:
《热题100》字符串、双指针、贪心算法篇
思路:对于输入的的字符串,只有三种可能,ipv4,ipv6,和neither ipv4:四位,十进制,无前导0,小于256 ipv6:八位,十六进制,无多余0(00情况不允许),不…...
大数据组件Sqoop-安装与验证
🥇🥇【大数据学习记录篇】-持续更新中~🥇🥇 个人主页:beixi 本文章收录于专栏(点击传送):【大数据学习】 💓💓持续更新中,感谢各位前辈朋友们支持…...
运算符重载(个人学习笔记黑马学习)
1、加号运算符重载 #include <iostream> using namespace std; #include <string>//加号运算符重载 class Person { public://1、成员函数重载号//Person operator(Person& p) {// Person temp;// temp.m_A this->m_A p.m_A;// temp.m_B this->m_B p…...
2023.9.6 Redis 的基本介绍
目录 Redis 的介绍 Redis 用作缓存和存储 session 信息 Redis 用作数据库 消息队列 消息队列是什么? Redis 用作消息队列 Redis 的介绍 特点: 内存中存储数据:奠定了 Redis 进行访问和存储时的快可编程性:支持使用 Lua 编写脚…...
2023-09-08力扣每日一题
链接: 2651. 计算列车到站时间 题意: 不看日期只看时间 解: ? 实际代码: 还看!你怎么肥四?int findDelayedArrivalTime(int arrivalTime, int delayedTime) {return (arrivalTimedelayed…...
adb-linux 调试桥
这里写自定义目录标题 摘要:一、简介二、adb使用参考连接 摘要: adb 可替代网络、串口等调试手段,可以方便的进行文件传输、终端登录等 一、简介 ADB的全称为Android Debug Bridge,即调试桥,方便调试设备或调试开发…...
入门人工智能 —— 使用 Python 进行文件读写,并完成日志记录功能(4)
入门人工智能 —— 使用 Python 进行文件读写(4) 入门人工智能 —— 使用 Python 进行文件读写打开文件读取文件内容读取整个文件逐行读取文件内容读取所有行并存储为列表 写入文件内容关闭文件 日志记录功能核心代码:完整代码:运…...
使用Caffeine实现帖子的缓存来优化网站的运行速度
导入依赖 <!-- https://mvnrepository.com/artifact/com.github.ben-manes.caffeine/caffeine --><dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId><version>3.1.7</version>…...
Webpack5 搭建Vue项目(进阶版)
Webpack5 搭建Vue项目(进阶版) 提示:中间隔了好长时间,我胡汉三又回来继续更新了!!!😂😂😂 文章目录 Webpack5 搭建Vue项目(进阶版)前…...
论文阅读:Distortion-Free Wide-Angle Portraits on Camera Phones
论文阅读:Distortion-Free Wide-Angle Portraits on Camera Phones 今天介绍一篇谷歌 2019 年的论文,是关于广角畸变校正的。 Abstract 广角摄影,可以带来不一样的摄影体验,因为广角的 FOV 更大,所以能将更多的内容…...
力扣每日一题---207. 课程表
Problem: 207. 课程表 文章目录 解题方法复杂度Code 解题方法 y总的 Topsort 模板题 复杂度 时间复杂度: 添加时间复杂度, 示例: O ( n ) O(n) O(n) 空间复杂度: 添加空间复杂度, 示例: O ( n ) O(n) O(n) Code class Solution {int res 0; public…...
在Kubernetes环境中有关Nginx Ingress与API Gateway的连接问题
文章目录 小结问题解决参考 小结 在Kubernetes环境中是通过Nginx Ingress来从外部访问Kubernetes内部的环境,并用API Gateway来分发请求,碰到了 502 Bad gateway.的问题,并尝试解决。 问题 从外部通过Nginx Ingress访问Kubernetes内部的环…...
c语言练习44:深入理解strstr
深入理解strstr strstr作用展示: #include <stdio.h> #include <string.h> int main() {char str[] "This is a simple string";char* pch;pch strstr(str, "simple");/*strncpy(pch, "sample", 6);*/printf("%s…...
渗透测试漏洞原理之---【业务安全】
文章目录 1、业务安全概述1.1业务安全现状1.1.1、业务逻辑漏洞1.1.2、黑客攻击目标 2、业务安全测试2.1、业务安全测试流程2.1.1、测试准备2.1.2、业务调研2.1.3、业务建模2.1.4、业务流程梳理2.1.5、业务风险点识别2.1.6 开展测试2.1.7 撰写报告 3、业务安全经典场景3.1、业务…...
CentOS查看CPU、内存、网络流量和磁盘 I/O
安装 yum install -y sysstat sar -d 1 1 rrqm/s: 每秒进行 merge 的读操作数目。即 delta(rmerge)/s wrqm/s: 每秒进行 merge 的写操作数目。即 delta(wmerge)/s r/s: 每秒完成的读 I/O 设备次数。即 delta(rio)/s w/s: 每秒完成的写 I/O 设备次数。即 delta(wio)/s rsec/s:…...
无人机航线规划
无人机航线规划,对于无人机的任务执行有着至关重要的作用,无人机在从起点飞向目的点的过程中,如何规划出一条安全路径,并且保证该路径代价最优,是无人机航线规划的主要目的。其中路径最优的含义是,在无人机…...
react中受控组件与非受控组件
受控组件与非受控组件 受控组件: 其值由 React 控制的组件,通常使用 state 来控制和修改组件的值。 例如受控的 组件: class NameForm extends React.Component {constructor(props) {super(props);this.state {value: };}handleChange (event) > {this.setState({val…...
【网络教程】如何解决Docker删除镜像和容器后磁盘空间未释放的问题
文章目录 问题分析解决方案删除未使用的容器删除未使用的镜像删除未使用的数据卷调整Docker数据存储路径问题分析 当删除Docker镜像和容器后,磁盘空间并未释放,这可能导致磁盘空间不足。造成此问题的原因包括: Docker镜像和容器的删除策略:默认情况下,Docker不会立即删除…...
Python中的进度条显示方案
迷途小书童 读完需要 3分钟 速读仅需 1 分钟 大家好,我是迷途小书童! tqdm 是一个非常常用的 Python 进度条库,它可以在循环迭代和 IO 操作期间添加一个进度条,直观地显示循环迭代的进程。 tqdm 是在 2013 年发布的,目的是为 Pyth…...
2023-09-05力扣每日一题
链接: 2605. 从两个数字数组里生成最小数字 题意: 两个数组都只包含1-9的数字,求一个最小数,两个数组内都要有它的其中一位 解: 要么是个位数要么是十位数,存一下数量和两边的最小数即可 实际代码&am…...
ODC现已开源:与开发者共创企业级的数据库协同开发工具
OceanBase 开发者中心(OceanBase Developer Center,以下简称 ODC)是一款开源的数据库开发和数据库管理协同工具,从首个版本上线距今已经发展了三年有余,ODC 逐步由一款专为 OceanBase 打造的开发者工具演进成为支持多数…...
生成克隆钓鱼网站与对win7进行后渗透操作
目录 目录 前言 系列文章列表 思维导图 1,实验涉及复现环境 2,CS的介绍 2.1,CS的简介 2.2,CS的主要功能 3,CS的安装 3.1,将cobalt_strike_4.5文件夹放到kali中 3.1,放入过程中的注意事项 3.2,如图所示 4,配置工具 4.1,进入c…...
Ubuntu18中NVIDIA,cuda,cudnn,pytorch安装
注意:nvidia驱动和cuda,cudnn,pytroch,python的对应关系 linux安装pytorch(包括cuda与cudnn)_linux清华园按照pytorch1.12_BryceRui的博客-CSDN博客 安装流程:安装cuda(包括nvidia驱动) cudnn python安装…...
MATLAB中M文件编写
简介 所谓M文件就是将处理问题的各种命令融合到一个文件中,该文件以.m为扩展名。然后,由MATLAB系统编译M文件,得出相应的运行结果。M文件具有相当大的可开发性和扩展性。M文件有脚本文件和函数文件两种。脚本文件不需要输入参数,…...
企业数字化神经网络
随着数字化时代的到来,数据已经成为企业战略性资源和重要的生产要素。企业数字化转型的核心是充分开发和利用数据资源,以数据为驱动,对业务流程进行重构与创新,从而提升企业的核心竞争力。业务系统是企业数据资源的源头࿰…...
C++this指针
本文旨在讲解C中this关键字,以及其相关作用! 定义 this 是 C 中的一个关键字,也是一个 const 指针,它指向当前对象,通过它可以访问当前对象的所有成员。 this的介绍 下面来看一下关于this这个关键字的实例࿰…...
【初阶C语言】操作符1--对二进制的操作
前言:本节内容介绍的操作符,操作的对象是二进制位。所以前面先介绍整数的二进制位 一、二进制位介绍 1.二进制介绍 (1)整数的二进制表示形式有三种:原码、反码和补码。 (2)原码、反码和补码的…...
安装pyscipopt
安装pyscipopt Conda会自动安装SCIP,因此所有内容都可以通过单个命令安装: GitHub - scipopt/PySCIPOpt: Python interface for the SCIP Optimization Suite conda create --name myenv python3.8 # 创建新环境 conda activate myenv # 激活新环境 …...
原生js实现的轮盘抽奖案例
来到大学也是有二年了,吃饭最多的地方就是在食堂,经过这么久的时间,已经几乎是把每个窗口的菜都吃腻了,所以我打算做个轮盘抽奖的形式来决定我每天要吃些什么。 目录 实现效果图: 静态搭建 js代码 1.实现此功能的思路…...
最经典的解析LSA数据库(第六课)
初步认识OSPF的大致内容(第三课)_IHOPEDREAM的博客-CSDN博客 1 OSPF 工作过程 建立领居表 同步数据库 今天来 说一说数据库概念 计算路由表 2 什么是数据库? 数据库是一个组织化的数据集合,用于存储、管理和检索数据。它是一个可访问的集合&#x…...
网上做医生哪个网站好/网络营销策划书1000字
计算机网络发生故障是不可避免的。网络故障诊断是网络管理的重要工作。一般当网络发生信息不通、不能浏览Web等连通性故障时,故障现象比较明确,容易观察和定位故障点,此类故障解决起来并不困难。然而最令人头痛的是网络是通的,但网…...
焦作市建设委员会网站/全国新冠疫情最新情况
摘要:在UE4中简单制作场景环境_资源库UE4与Maya、ZBrush等软件的配合,可以制作出很多精致逼真的场景环境,然而大多数的开发者都不太熟悉场景环境的制作流程。下面以一个小型环境为例,简单介绍场景环境的制作过程。先来看看这则由高…...
搜索引擎 网站推广 举例/seo排名工具给您好的建议
每天一篇Excel技术图文微信公众号:Excel星球NO.145-I Find You作者:看见星光微博:EXCELers / 知识星球:ExcelHI,大家好,我是星光。这章继续给大家分享VBA常用对象之单元格的编程技巧。虽然没有自古以来&…...
中国那个公司的网站做的最好/制作网页的工具软件
文/徐任冲 阿里巴巴上巿,是否会像有些人预言的“必将带动中国电商井喷式”那样发展,我无法断言、更不想断言。但各种马云的个人崇拜已可略见端倪,各种真假难辨的过往、各种似真还假的语录层出不穷,真让人艰于呼吸视听。更恰当地讲…...
网站建设实施方案/app开发工具
代码: print("test begin") function foo (a)print("foo 函数输出", a)return coroutine.yield(2 * a) -- 返回 2*a 的值 endco coroutine.create(function (a , b)print("第一次协同程序执行输出", a, b) -- co-body 1 10local r…...
莒南做网站/软文推广产品
3D成像关键技术,主要有四种关键技术:立体视觉、结构光3D成像、激光三角形测量、TOF,后面三个是主动成像,需要外加光源来实现。立体视觉我们也许在很多场合中看到过这样的场景,安装两个摄像机才能获得物体的不同视角。校…...