文章目录
一、题目链接
链接: 704. 二分查找
二、参考代码
cpp
int search(const vector<int>& nums, int target) {
int left = 0; int right = nums.size() - 1;
//左闭右闭[]
while (left <= right)
{
int mid = (left + right) / 2;
if (nums[mid] > target)
{
right = mid - 1;
}
else if (nums[mid] < target)
{
left = mid + 1;
}
else
{
return mid;
}
}
return -1;
//左闭右闭[)
/*
while (left < right)
{
int mid = (left + right) / 2;
if (nums[mid] > target)
{
right = mid;
}
else if (nums[mid] < target)
{
left = mid + 1;
}
else
{
return mid;
}
}
return -1;
*/
}
三、所思所悟
cin、cin.getline() 和 getline() 是 C++ 标准库中用于从标准输入(通常是键盘)读取数据的三种不同方式。它们的主要区别如下:
cin:
cin 是一个 istream 对象,用于从标准输入流读取数据。
当使用 cin 读取数据时,它会在遇到空白(如空格、制表符或换行符)时停止读取。
cin 通常用于读取单个数据项,如 int、float、double 等。
cin.getline():
cin.getline()实际上有三个参数,第三个通常省略cin.getline(接收字符串的变量,接收字符个数,结束字符)
cin.getline() 是 cin 的成员函数,用于从标准输入流读取一行数据,直到遇到换行符。
它会读取换行符之前的整行数据,包括空格,并将其存储在提供的字符数组中。
cin.getline() 通常用于读取字符串,但它不是用来读取单个数据项的好选择,因为它会将整行数据作为一个字符串读取。
getline():
getline() 是一个全局函数,用于从 istream 对象(如 cin)读取一行数据,直到遇到换行符。
它会读取换行符之前的整行数据,包括空格,并将其存储在提供的 string 对象中。
getline() 是读取一行数据的标准方式,特别是当你需要处理包含空格的字符串时。
在此题如果不知道输入的长度,但是要全部且最后一个为搜索值的时候可以这样输入
cpp
#include <iostream>
#include <vector>
#include <sstream>
#include <string>
using namespace std;
int search(const vector<int>& nums, int target) {
int left = 0; int right = nums.size() - 1;
//左闭右闭[]
while (left <= right)
{
int mid = (left + right) / 2;
if (nums[mid] > target)
{
right = mid - 1;
}
else if (nums[mid] < target)
{
left = mid + 1;
}
else
{
return mid;
}
}
return -1;
//左闭右闭[)
/*
while (left < right)
{
int mid = (left + right) / 2;
if (nums[mid] > target)
{
right = mid;
}
else if (nums[mid] < target)
{
left = mid + 1;
}
else
{
return mid;
}
}
return -1;
*/
}
int main() {
vector<int> nums;
string data;
getline(cin, data);
istringstream iss(data);
int num;
while (iss >> num) {
nums.push_back(num);
}
int target = -1;
if (!nums.empty()) {
target = nums.back();
nums.pop_back();
}
cout << search(nums, target);
return 0;
}