信息學奧賽初賽天天練-20-完善程序-vector數組參數引用傳遞、二分中值與二分邊界應用的深度解析

PDF文檔公眾號回復關鍵字:20240605
在這里插入圖片描述

1 2023 CSP-J 完善程序1

完善程序(單選題,每小題 3 分,共計 30 分)

原有長度為 n+1,公差為1等升數列,將數列輸到程序的數組時移除了一個元素,導致長度為 n 的開序數組可能不再連續,除非被移除的是第一個或最后之個元素。需要在數組不連續時,找出被移除的元素。試補全程序。

源程序

01 #include <iostream>
02 #include <vector>
03
04 using namespace std;
05
06 int find_missing(vector<int>& nums){
07 		int left = 0, right = nums.size() - 1;
08 		while (left < right){
09   		int mid = left + (right-left) / 2;
10   		if (nums[mid]==mid+ ①){
11        		②;
12    		}else{
13      		③
14    		}
15   	}
16  	return ④;
17 }
18
19 int main(){
20 		int n;
21 		cin >> n;
22 		vector<int> nums(n);
23 		for (int i= 0; i< n; i++) cin >> nums[i];
24 		int missing_number = find_missing(nums);
25 		if(missing_number == ⑤) {
26     		cout << "Sequence is consecutive" << endl;
27 		}else{
28    		cout << "Missing number is " << missing_number << endl;
29 	    }
30 		return 0;
31 }

33 ①處應填( )

A 1 B nums[0] C right D left

34 ②處應填( )

A left=mid+1 B right=mid-1 C right=mid D left=mid

35 ③處應填( )

A left=mid+1 B right=mid-1 C right=mid D left=mid

36 ④處應填( )

A left+nums[0] B right+nums[0] C mid+nums[0] D right+1

37 ⑤處應填( )

A nums[0]+n B nums[0]+n-1 C nums[0]+n+1 D nums[n-1]

2 相關知識點

1) vector 參數傳遞-值傳遞

函數內形參改變對調用實參無影響

#include<bits/stdc++.h>
using namespace std;/*值傳遞 函數內增量了副本 函數內修改 對實參無影響 
*/ 
void testVector(vector<int> vec){vec.push_back(4); /*輸出vec數組中每個元素,main函數實參傳遞過來3個2,函數內增加了1個4輸出 2 2 2 4 */ for(int i=0;i<vec.size();i++){cout <<vec[i]<< ' ';}
}int main(){vector<int> vec(3,2);//聲明一個vector數組,初始化3個2 testVector(vec);//調用函數輸出 cout<<endl; //testVector 增加的4 對main函數的vec沒影響/*輸出vec數組中每個元素3個2輸出 2 2 2 */ for(int i=0;i<vec.size();i++){cout <<vec[i]<< ' ';}return 0;
}

2) vector 參數傳遞-指針傳遞

函數內形參改變,改變了調用的實參

#include<bits/stdc++.h>
using namespace std;/*指針傳遞 函數操作的是vector指針,通過指針對vector數組修改后vector被改變 
*/ 
void testVector(vector<int> *vec){(*vec).push_back(4); /*輸出vec數組中每個元素,main函數實參傳遞過來3個2,函數內增加了1個4輸出 2 2 2 4 */ for(int i=0;i<(*vec).size();i++){cout <<(*vec)[i]<< ' ';}
}int main(){vector<int> vec(3,2);//聲明一個vector數組,初始化3個2 testVector(&vec);//調用函數輸出 cout<<endl; //testVector 增加了4 /*輸出vec數組中每個元素3個2和 4輸出 2 2 2 4*/ for(int i=0;i<vec.size();i++){cout <<vec[i]<< ' ';}return 0;
}

3) vector 參數引用傳遞

函數內形參改變,改變了調用的實參

#include<bits/stdc++.h>
using namespace std;/*指針傳遞 形參相當于是實參的別名,對形參的操作其實就是對實參的操作,形參vector改變,實參也會改變 
*/ 
void testVector(vector<int> &vec){vec.push_back(4); /*輸出vec數組中每個元素,main函數實參傳遞過來3個2,函數內增加了1個4輸出 2 2 2 4 */ for(int i=0;i<vec.size();i++){cout <<vec[i]<< ' ';}
}int main(){vector<int> vec(3,2);//聲明一個vector數組,初始化3個2 testVector(vec);//調用函數輸出 cout<<endl; //testVector 增加了4 /*輸出vec數組中每個元素3個2和 4輸出 2 2 2 4*/ for(int i=0;i<vec.size();i++){cout <<vec[i]<< ' ';}return 0;
}

4) 二分查找中間值

/* 向右逼近,如果找到滿足條件的數,會繼續向右找更大的數mid=(left+right)/2 left和right都接近最大值時,可能溢出可以使用下面寫法替換mid=left + (right-left) / 2;
*//* 向左逼近,如果找到滿足條件的數,會繼續向左找更小的數mid=(left+right+1)/2 left和right都接近最大值時,可能溢出可以使用下面寫法替換mid=left + (right-left+1) / 2;
*/

5) 二分找邊界

//左閉右閉 while left right 最終left=right+1
while(left<=right)  left = mid + 1; right =mid-1;
//左閉右開 while left right 最終left=right
while(left<right)   left = mid + 1; right =mid;
//左開右閉 while left right 最終left=right
while(left<right)   left=mid;       right=mid+1;
//左開右開 while left right 最終left=right-1
while(left+1<right) left=mid;       right=mid;

3 思路分析

二分法,在本程序中find_missing函數就是利用二分法來找到一個長度為n的數組中不連續的位置,從而找出被移除 元素的值。只需通過二分找到從左往右第一處使得nums[i]不為nums[0]+i的的位置,那么在數組中被移除的數就是nums[0]+i

33 ①處應填( )

A 1 B nums[0] C right D left

答案 B

分析

/*
若數組連續, 一定有nums[i]==nums[0]+i,所以只需通過二分找到第一處使得nums[i]不為nums[0]+i的的位置即可。因此二分的判斷條件是nums[mid]==mid+nums[0]所以選B
*/

34 ②處應填( )

A left=mid+1 B right=mid-1 C right=mid D left=mid

答案 A

分析

//由判斷條件 nums[mid]==mid+nums[0] 可知,mid的左半部分是滿足順序的,繼續往右找//由于mid計算是向下取整,需要向右靠近 所以left=mid+1
//int mid = left + (right-left) / 2; mid計算是向下取整 需要left=mid+1,向右逼近
int find_missing(vector<int>& nums){int left = 0, right = nums.size() - 1;while (left < right){int mid = left + (right-left) / 2;if (nums[mid]==mid+nums[0]){left=mid+1;//找到滿足條件的繼續向右找}else{right=mid;}}return left+nums[0];
}
//nums={0,1,3,4,5} 下面模擬具體細節
/*
left =0 right=4
mid=(0+4)/2=2 nums[2]=3,mid+nums[0]=2+0=2 不等 rgiht=mid=2 left=0 滿足 while(left<right)
mid=(0+2)/2=1 nums[1]=1,mid+nums[0]=1+0=1 相等 left=mid+1=1 right=2 不滿足 while(left<right)
退出循環
返回left+nums[0]=2
*///int mid = left + (right-left) / 2; mid計算是向下取整 如果left=mid 可能會死循環
int find_missing(vector<int>& nums){int left = 0, right = nums.size() - 1;while (left < right){int mid = left + (right-left) / 2;if (nums[mid]==mid+nums[0]){left=mid;//如果改成left=mid 會死循環}else{right=mid;}}return left+nums[0];
}
//nums={0,1,3,4,5}時會死循環 下面模擬具體細節
/*
left =0 right=4
mid=(0+4)/2=2 nums[2]=3,mid+nums[0]=2+0=2 不等 rgiht=mid=2 left=0 滿足 while(left<right)
mid=(0+2)/2=1 nums[1]=1,mid+nums[0]=1+0=1 相等 left=mid=1 right=2 滿足 while(left<right)
mid=(1+2)/2=1 nums[1]=1,mid+nums[0]=1+0=1 相等 left=mid=1 right=2 滿足 while(left<right)
*/

35 ③處應填( )

A left=mid+1 B right=mid-1 C right=mid D left=mid

答案 C

分析

/*
由于退出條件是 while (left < right) 最終退出時left==right ,前面又 left=mid+1,所以right==mid即可while(left<right) 對應 二分區間是前閉后開或者前開后閉
*/

36 ④處應填( )

A left+nums[0] B right+nums[0] C mid+nums[0] D right+1

答案 A

分析

//如果序列從0開始,最后1個找到的連續數字再找一個就是被移除的,前面示例
//nums={0,1,3,4,5} 下面模擬具體細節
/*
left =0 right=4
mid=(0+4)/2=2 nums[2]=3,mid+nums[0]=2+0=2 不等 rgiht=mid=2 left=0 滿足 while(left<right)
mid=(0+2)/2=1 nums[1]=1,mid+nums[0]=1+0=1 相等 left=mid+1=1 right=2 不滿足 while(left<right)
退出循環
返回left+nums[0]=2
移除的數是2
*///如果不從0開始
//nums={2,3,5,6,7}
/*
left =0 right=4
mid=(0+4)/2=2 nums[2]=5,mid+nums[0]=2+2=4 不等 rgiht=mid=2 left=0 滿足 while(left<right)
mid=(0+2)/2=1 nums[1]=3,mid+nums[0]=1+2=3 相等 left=mid+1=2 right=2 不滿足 while(left<right)
退出循環
返回left+nums[0]=2+2=4
移除的數是4
*/
//退出條件是while(left<right) 最終left==right
//所以答案A和B都對,一般習慣返回left

37 ⑤處應填( )

A nums[0]+n B nums[0]+n-1 C nums[0]+n+1 D nums[n-1]

答案 D

分析

找到數組的最后一個,無論最后一個是否相等都說明前面都是連續的

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/22782.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/22782.shtml
英文地址,請注明出處:http://en.pswp.cn/web/22782.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

云原生架構案例分析_5.某體育用品公司云原生架構的業務中臺構建

1.背景和挑戰 某體育用品公司作為中國領先的體育用品企業之一&#xff0c;在2016年&#xff0c;某體育用品公司啟動集團第三次戰略升級&#xff0c;打造以消費者體驗為核心的“3”&#xff08;“互聯網”、“體育”和“產品”&#xff09;的戰略目標&#xff0c;積極擁抱云計算…

NeuralForecast TokenEmbedding 一維卷積 (Conv1d) 與矩陣乘法

NeuralForecast TokenEmbedding 一維卷積 (Conv1d) 與矩陣乘法 flyfish TokenEmbedding中使用了一維卷積 (Conv1d) TokenEmbedding 源碼分析 在源碼的基礎上增加調用示例 下面會分析這段代碼 import torch import torch.nn as nn class TokenEmbedding(nn.Module):def __i…

C++模板類與Java泛型類的實戰應用及對比分析

C模板類和Java泛型類都是用于實現代碼重用和類型安全性的重要工具&#xff0c;但它們在實現方式和應用上有一些明顯的區別。下面&#xff0c;我將先分別介紹它們的實戰應用&#xff0c;然后進行對比分析。 C模板類的實戰應用 C模板類允許你定義一種通用的類&#xff0c;其中類…

SEO 與 PPC 之間的區別

按點擊付費 &#xff08;PPC&#xff09;&#xff1a; PPC 是一種網絡營銷技術&#xff0c;廣告商在每次點擊廣告時向網站支付一定金額&#xff0c;廣告商只為符合條件的點擊付費。Google 廣告、Bing 和 Yahoo 廣告基于按點擊付費的概念。PPC是用于在搜索引擎首頁上列出的最快方…

【前端】響應式布局筆記——rem

三、rem 指相對于根元素的字體大小的單位。 根字體大小通常設置為10px,方便換算。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-s…

鴻蒙開發接口安全:【@system.cipher (加密算法)】

加密算法 說明&#xff1a; 本模塊首批接口從API version 3開始支持。后續版本的新增接口&#xff0c;采用上角標單獨標記接口的起始版本。 導入模塊 import cipher from system.ciphercipher.rsa rsa(Object): void RSA 算法加解密。 系統能力&#xff1a; SystemCapabil…

Pointnet++改進卷積系列:全網首發SMPConv連續卷積 |即插即用,提升特征提取模塊性能

簡介:1.該教程提供大量的首發改進的方式,降低上手難度,多種結構改進,助力尋找創新點!2.本篇文章對Pointnet++特征提取模塊進行改進,加入SMPConv,提升性能。3.專欄持續更新,緊隨最新的研究內容。 目錄 1.理論介紹 2.修改步驟 2.1 步驟一 2.2 步驟二 2.3 步驟

K8S==ingress配置自簽名證書

安裝openssl Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 生成證書 openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout example.local.key -out example.local.crt -subj "/CNexample.local/Oexample.local"創建K8S secr…

【簡單講解TalkingData的數據統計】

&#x1f3a5;博主&#xff1a;程序員不想YY啊 &#x1f4ab;CSDN優質創作者&#xff0c;CSDN實力新星&#xff0c;CSDN博客專家 &#x1f917;點贊&#x1f388;收藏?再看&#x1f4ab;養成習慣 ?希望本文對您有所裨益&#xff0c;如有不足之處&#xff0c;歡迎在評論區提出…

Vue3中的常見組件通信之mitt

Vue3中的常見組件通信之mitt 概述 ? 在vue3中常見的組件通信有props、mitt、v-model、 r e f s 、 refs、 refs、parent、provide、inject、pinia、slot等。不同的組件關系用不同的傳遞方式。常見的撘配形式如下表所示。 組件關系傳遞方式父傳子1. props2. v-model3. $refs…

用例篇03

正交表 因素&#xff1a;存在的條件 水平&#xff1a;因素的取值 最簡單的正交表&#xff1a;L4(2) 應用 allpairs 來實現正交表。 步驟&#xff1a; 1.根據需求找出因素和水平 2.將因素和水平寫入到excel表格中&#xff08;表格不需要保存&#xff09;&#xff08;推薦用…

SpaceX 首席火箭著陸工程師 MIT論文詳解:非凸軟著陸最優控制問題的控制邊界和指向約束的無損凸化

上一篇blog翻譯了 Lars Blackmore(Lars Blackmore is principal rocket landing engineer at SpaceX)的文章&#xff0c;SpaceX 使用 CVXGEN 生成定制飛行代碼,實現超高速機載凸優化。利用地形相對導航實現了數十米量級的導航精度,著陸器在著陸過程中成像行星表面并將特征與機載…

PHP序列化、反序列化

目錄 一、PHP序列化&#xff1a;serialize() 1.對象序列化 2.pop鏈序列化 3.數組序列化 二、反序列化&#xff1a;unserialize() 三、魔術方法 ?四、NSSCTF相關簡單題目 1.[SWPUCTF 2021 新生賽]ez_unserialize 2.[SWPUCTF 2021 新生賽]no_wakeup 學習參考&#xff1…

054、Python 函數的概念以及定義

編程大師Martin Fowler曾說過&#xff1a;“代碼有很多種壞味道&#xff0c;重復是最壞的一種。” 那么遇到重復的代碼&#xff0c;如何做&#xff1f;答案就是&#xff1a;函數。 函數就是把重復的代碼封裝在一起&#xff0c;然后通過調用該函數從而實現在不同地方運行同樣的…

解決MAC M1 Docker Desktop啟動一直在starting

問題描述&#xff1a; 今天使用docker buildx 構建Multi-platform&#xff0c;提示如下錯誤&#xff1a; ERROR: Multi-platform build is not supported for the docker driver. Switch to a different driver, or turn on the containerd image store, and try again. 于是按…

蘋果ios用戶下載ipa文件內測簽名的后的app應用下載安裝到手機圖標消失了是什么原因呢?

下載好的應用竟然找不到了&#xff1f;究竟有哪些原因呢&#xff1f;本篇文章將總結一些可能性&#xff01; 若你在蘋果設備上下載了一個應用程序&#xff0c;但它的圖標不見了&#xff0c;可能有以下幾種原因&#xff1a; 1. 刪除應用的時候出現彈窗如果你錯誤的點擊到了從…

EasyRecovery2024破解版本下載,電腦數據恢復新突破!

在當今數字化時代&#xff0c;數據安全和軟件版權已成為全球關注的熱點。EasyRecovery&#xff0c;作為一款廣受歡迎的數據恢復軟件&#xff0c;因其強大的數據恢復功能而深受用戶喜愛。然而&#xff0c;隨著“EasyRecovery2024 crack”關鍵詞的流行&#xff0c;我們不得不面對…

電子電氣架構 —— 刷寫模式:并行刷寫

電子電氣架構 —— 刷寫模式:并行刷寫 我是穿拖鞋的漢子,魔都中堅持長期主義的工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 人們會在生活中不斷攻擊你。他們的主要武器是向你灌輸對自己的懷疑:你的價值、你的能力、你的潛力。他們往往會將此…

【深度學習入門篇一】阿里云服務器(不需要配環境直接上手跟學代碼)

前言 博主剛剛開始學深度學習&#xff0c;配環境配的心力交瘁&#xff0c;一塌糊涂&#xff0c;不想配環境的剛入門的同伴們可以直接選擇阿里云服務器 阿里云天池實驗室&#xff0c;在入門階段跑個小項目完全沒有問題&#xff0c;不要自己傻傻的在那配環境配了半天還不匹配&a…

二叉樹的層序遍歷Ⅱ-力扣

很簡單的一道題&#xff0c;將前一道題的結果數組進行一次反轉即可。 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(i…