C++ - vector 的相關練習

目錄

前言

1、題1 只出現一次的數字 :

解法一:遍歷

參考代碼:

解法二:按位異或

參考代碼:

解法三:哈希表

參考代碼:

2、題2 楊輝三角:

參考代碼:

總結


前言

路漫漫其修遠兮,吾將上下而求索;


大家可以自己先嘗試做一下:

136. 只出現一次的數字 - 力扣(LeetCode)

118. 楊輝三角 - 力扣(LeetCode)


1、題1 只出現一次的數字

136. 只出現一次的數字 - 力扣(LeetCode)

解法一:遍歷

利用雙指針,一個指針定位一個指針去遍歷后續的數字看是否有重復的;

參考代碼:

    int singleNumber(vector<int>& nums) {int n = nums.size();if(n==1) return nums[0];//解法一:遍歷for(int i = 0;i<n;i++){int flag = 1;for(int j = 0;j<n;j++){if(j!=i && nums[i] == nums[j]) flag = 0; }if(flag) return nums[i];}return 0;//此處的返回沒有意義,隨便返回就可以了}

解法二:按位異或

按位異或的特點:相同為0,相異為1;非空數組nums 中只有一個數字出現了1次,其余的均出現了2次,將nums 中的數據全部進行按位異或,相同的數據抵消就會得到那個只出現一次的數;

參考代碼:

    int singleNumber(vector<int>& nums) {//按位異或int ret = 0;for(auto e: nums) {ret ^= e;}return ret;}

解法三:哈希表

將nums 中的數據放入hash 之中,看哪一個數字出現了一次即可;

參考代碼:

    int singleNumber(vector<int>& nums) {//hashunordered_map<int,int> hash;//<數據,出現的次數>for(auto e: nums){hash[e]++;}for(auto e:hash){if(e.second == 1) return e.first;}return 0;//隨便返回一個}

2、題2 楊輝三角:

118. 楊輝三角 - 力扣(LeetCode)

如果用C語言解決的話,需要返回一個二級指針:

本題用C語言做會非常惡心,可以將楊輝三角想象成二維數組,只是不同的是它不是 m*n 的每一行的數據個數均相等的,楊輝三角的每一行的個數是變化的;

用C語言不能直接靜態開辟一個二維數組,只能通過動態開辟的方式;

Q:如何動態開辟一個二維數組?

  • 將楊輝三角想象成一個直角三角形;楊輝三角畫成等腰三角形其本質是一個邏輯結構(想象出來的結構);

  • 用C語言做動態開辟數組:先開辟指針數組,然后造一個循環開辟每一行;并且釋放的時候也要注意,不能直接釋放指針數組,需要寫一個循環先將指針數組中所指向的數組先釋放(先釋放局部再釋放整體);

由于C語言只支持一次即返回一個值,而如果想要返回多個值,想讓別人拿到該數組的大小只能通過傳址傳參;在leetcode 之中要寫通用的代碼,凡是返回數組(返回指向該數組的指針),就得告訴這個數組有多少行,此時寫測試用例的時候,每個題都要有每個題的情況;

因為返回一個一維數組需要知道這個一維數組中有多少個數據,同理,返回一個二維數組就需要知道二維數組有多少行,并且一行中有多少個數據;所以其第三個參數,指的是所要返回這個二維數組每一行中有多少個數據;

Q:第三個參數為什么是二級指針呢?

  • 二維數組中每一行的數據個數可能是不同的,需要開辟一塊空間來記錄每一行的數據個數;所以就需要傳一個地址的地址,即二級指針;

我們此處用C++來解決:

Q: 如何理解 vector<vector<int>> ?

  • 在vector 中存放vector<int> ; vector 的底層:
template<class T>
class vector
{
private:T* _a;size_t _size;size_t _capacity;
};

Q: vector<vector<int>>是如何開辟需求的二維數組?

	vector<vector<int>> vv(numRows);//開辟numRows行for (int i = 0; i < numRows; ++i)//開辟每一行{vv[i].resize(i + 1, i);}

vector<vector<int>> 會實例化出兩個類,vector<int> 是一個類,而vector<vector<int>> 是另外一個類;

vector<int> 實例化:

vector<vector<int>> 實例化:

類模板給不同的模板參數就會生成不同的類型;這兩個雖然是從同一個模板中實例化出來的,但是他們的類型不同,一個是 int? ,一個是 vector<int>;

vector<vector<int>> 是一個對象數組其每一個位置上是一個 vector<int> 對象;

我們在開辟每一行的時候用resize 進行初始化,而并非使用reserve , 這是因為reserve 只會開辟空間而并未插入數據;而resize ,當 n>capacity? 或 size<n<capacity 的時候會插入數據,相當于用resize 既可以開辟空間又會初始化;

需要注意的是,已經存在的對象想要初始化就只能使用resize

一個vector 想要初始化有兩種方式:

  • 1、在構造的時候進行初始化;
  • 2、構造之后利用resize 進行初始化;

基于楊輝三角的特點,我們需要將開辟的二維數組中的空間均初始化為1,如下:

而接下來就需要處理楊輝三角中其他剩余的值了;訪問 vector<vector<int>> 中的數據可以通過二維數組的訪問形式進行訪問: vv[i][j] , 但是其底層與二維數組的訪問完全不同

在回答“ vv[i][j]的底層與二維數組的訪問完全不同” 的問題之前,我們先了解一下C語言中二維數組的兩種開辟方式:

對于二維數組:eg.int aa[10][5] , 10 行 5 列的二維數組本質上也是一維數組;

  • 1、動態開辟二維數組需要進行轉換;
	int* aa = (int*)malloc(sizeof(int*) * N);for(int i = 0; i < N; ++i){aa[i] = (int*)malloc(sizeof(int) * (i + 1));}

aa 作為二維數組數組名,表示該數組的首元素地址,即指向該指針數組;aa[i] 則是訪問指針數組中的所對應的數據,而指針數組的元素本身就是一級指針,那么 aa[i][j] 就是兩次解引用,訪問到了二維數組中的數據;動態開辟的二維數組是兩次指針的解引用,先進行第一層的解引用拿到指針數組中的元素,再進行第二層的解引用,拿到真實存放的數據;

  • 2、靜態開辟的二維數組,是轉換成一個一維數組;

eg.int aa[10][5];

C語言中的靜態二維數組其實在底層其實是一個一維數組,那么?int aa[10][5];是一個有50個int 類型空間的一維數組,即一次解引用就可以解決(會通過一些計算來實現一次解引用);

總之,動態開辟和靜態開辟是不一樣的;

C++中,對于vv[i][j]而言,是兩次函數調用對于C語言來說,靜態開辟的一維數組或者二維數組均是一次解引用實現數據的訪問,數組的訪問本質上均會轉換成指針的訪問,所以C語言的訪問數組中的元素一定會轉換成對指針的解引用;

Q:vv[i][j] 如何轉換成兩個函數調用?

  • 首先,vv[i][j] 會轉化成 vv.operator[](i).operator[](j) ;其中 vv.operator[](i) 返回的是 vector<int> 的對象,而vector<int>.operator[](j) 返回值為 int 對象相當于第一個 operator[] 的調用返回了vector<int> 對象又會作為下一次調用 operator[] 的左操作數,此時返回值為 int 類型的對象;于是乎就相當于拿到了第 i 行第 j 個對象;

Q: 相較于我們之前使用的二維數組(C語言中的二維數組),此處使用vector<vector<int>> 的好處是什么?

  • vector<vector<T>> 的功能更加強大在C語言中以前定義的靜態數組,靜態數組中的每一行的數據個數均是固定的,由于C語言不支持變長數組,其行、列必須是常量,且無論是申請還是釋放都需要親歷親為,比較麻煩;但是倘若使用 vector<vector<>> ,便就不存在這樣的問題,無需管釋放(C++中會自動調用析構函數),并且其每一行的數據個數為多少均無所謂, 即不會強制每一行的數據個數均需要一樣;

vv[i][j] 看似有兩個[ ], 實際上結合底層的角度它是調用了兩個類實例化出來的operator[] ,而這兩個類又是由 vector<T> 實例化出來的。由 vector<T> 實例化出來兩個類 vector<int> 和 vector<vector<int>> ,然后再實例化其成員函數;

解題:

?

需要從第2行開始遍歷,而一有 vv.size() 行;

對于每一行元素訪問的控制j ; 每一行的數據個數是不固定的,從每一個 vector<vector<int>> 對象的 _size 可以得知每一行中數據的個數,即 vv[i].size() 為第 i 行中的數據個數;對于楊輝三角來說,其每一行的第一個和最后一個無需進行訪問,我們在開辟空間初始化的時候就可以完成;

楊輝三角的計算規則:

  • 將楊輝三角看作是一個直角三角形:

通過觀察楊輝三角的計算規則和下標的關系,我們可以得到: [i,j] = [i-1 , j] + [i-1 , j-1];

參考代碼:

    vector<vector<int>> generate(int numRows) {vector<vector<int>> vv(numRows);for(size_t i = 0;i<numRows;++i){vv[i].resize(i+1,1);}//填for(int i = 2;i<vv.size();++i)//從2行開始{for(int j = 1; j<vv[i].size()-1;++j){//第一個和最后一個不用填vv[i][j] = vv[i-1][j] + vv[i-1][j-1];}}return vv;}

總結

1、在C++中中,vector<vector<int>> 用vv[i][j] 訪問數據會轉化調用兩個函數,即?vv.operator[](i).operator[](j)

2、其中 vv.operator[](i) 返回的是 vector<int> 的對象,而vector<int>.operator[](j) 返回值為 int 對象相當于第一個 operator[] 的調用返回了vector<int> 對象又會作為下一次調用 operator[] 的左操作數,此時返回值為 int 類型的對象;于是乎就相當于拿到了第 i 行第 j 個對象;

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

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

相關文章

JDK 1.8 Stream API:集合流處理深度解析

JDK 1.8 Stream API&#xff1a;集合流處理深度解析 摘要&#xff1a;Stream API 是 JDK 1.8 的革命性特性&#xff0c;它將集合操作從傳統迭代升級為聲明式函數式處理。Stream API三個階段&#xff08;創建→中間操作→終端操作&#xff09;詳解流處理機制&#xff0c;輔以代…

2025學年湖北省職業院校技能大賽 “信息安全管理與評估”賽項 樣題卷(二)

2025學年湖北省職業院校技能大賽 “信息安全管理與評估”賽項 樣題卷&#xff08;二&#xff09; 第一部分&#xff1a;第二部分&#xff1a;網絡安全事件響應、數字取證調查、應用程序安全任務書任務 1&#xff1a;應急響應&#xff08;可以培訓有答案&#xff09;任務 2&…

AiPy實戰(5):效率革命!5分鐘構建行業分析報告

在當今數字化時代&#xff0c;數據呈指數級增長&#xff0c;行業分析報告對于企業的決策制定愈發關鍵。傳統上&#xff0c;撰寫一份行業分析報告&#xff0c;需要分析師耗費大量時間從各類數據庫、新聞資訊平臺、行業報告中手動收集數據&#xff0c;再進行整理、分析和撰寫&…

docker小白自存-windows系統通過docker安裝n8n-nodes-puppeteer

n8n上直接在社區下載puppeteer節點&#xff0c;使用時會報錯說沒有chromium依賴。 找到了n8n-nodes-puppeteer的github試圖解決 根據他的docker安裝指南執行&#xff0c;運行容器時會報exec /docker-custom-entrypoint.sh: no such file or directory &#xff08;明明文件都有…

腳本shebang的作用與使用方法

#!&#xff08;稱為 shebang 或 hashbang&#xff09;是腳本文件開頭的前兩個字符&#xff0c;用于告訴操作系統應該使用哪個解釋器來執行該腳本。 核心作用&#xff1a; 指定解釋器&#xff1a; 明確告訴系統運行這個腳本時應該調用哪個程序&#xff08;解釋器&#xff09;來…

【大模型學習 | BERT 量化學習 (1)】

BERT 情感分析 一、 數據集加載與模型訓練 from transformers import BertTokenizer, BertForSequenceClassification, Trainer, TrainingArguments from datasets import load_dataset import torch import numpy as np from sklearn.metrics import accuracy_score mode_na…

用低通濾波優化串口或485 通信指示燈電路

常見的通信指示燈電路就是簡單的把LED 連到TXD 和RXD 上&#xff0c;一有動靜就閃一下。問題是&#xff0c;如果波特率很高&#xff0c;一次通信時間很短&#xff0c;相當于占空比很低&#xff0c;LED 閃爍的亮度就很弱&#xff0c;不容易觀察。比如MODBUS 通信&#xff0c;波特…

【純干貨】調整word目錄中的行距以及右對齊頁碼

1.問題展現 目錄生成會遇到一些奇葩現象 所以到了展現技術力的時候了【doge】 2.解決word目錄中的行距問題 選中目錄中的文字-》段落 此時你可能勾選了圖片中的一個以上&#xff0c;把他們都取消了&#xff0c; 由于一個目錄的標題對應一個樣式&#xff0c;第一個也可以取消 …

pandas 優雅處理值類型為list的列的csv讀寫問題

文章目錄 直接存儲join list 變成字符串存儲json.dumps序列化存儲以及json.loads反序列化讀取總結 之所以分析這個問題,是因為讀者在跟第三方數據供應商對接數據的時候,老是會遇到數據加載都會出錯的問題,其中一個原因就是list類型數據沒有正確儲存,于是筆者在這篇文章里面詳細…

一種解決 OpenWrt 安裝 docker 之后局域網的設備之間無法互相訪問通信的方法

文章目錄 一、問題背景二、解決方案&#xff08;方法一&#xff09;修改全局設置的 轉發&#xff08; forward&#xff09; 為 接受&#xff08;ACCEPT&#xff09;&#xff08;方法二&#xff09;設置 net.bridge.bridge-nf-call-iptables0 并將 docker 的容器網絡設置為host …

Leetcode百題斬-貪心

貪心也是一個很有意思的專題&#xff0c;能遇到很多神奇的思路。 但這個專題&#xff0c;leetcode也沒放Hard&#xff0c;果然是怕這種玄學專題上點難度大家罩不住。那就很快了&#xff0c;直接過 763. Partition Labels[Medium] 思路&#xff1a;將字母串分組&#xff0c;相…

基于多徑信道的分集接收技術性能優化與仿真分析

基于多徑信道的分集接收技術性能優化與仿真分析 一、多徑信道建模與仿真 1. 多徑信道建模(MATLAB實現) classdef MultipathChannel < handlepropertiesSampleRate = 1e6; % 采樣率 (Hz)MaxDoppler = 100; % 最大多普勒頻移 (Hz)DelayVector = [0

LeetCode 713.乘積小于K的子數組

給你一個整數數組 nums 和一個整數 k &#xff0c;請你返回子數組內所有元素的乘積嚴格小于 k 的連續子數組的數目。 示例 1&#xff1a; 輸入&#xff1a;nums [10,5,2,6], k 100 輸出&#xff1a;8 解釋&#xff1a;8 個乘積小于 100 的子數組分別為&#xff1a;[10]、[5…

打破網絡安全孤島:實現防御數據協作

作者&#xff1a;來自 Elastic Crossley McEwen, Oksana Abramovych 現代網絡戰場不再受組織邊界的限制。在各類防御網絡中&#xff0c;關鍵的結構化、非結構化和半結構化數據分布在不同的專業環境中&#xff0c;形成孤島 —— 從機密情報系統到作戰指揮平臺&#xff0c;再到戰…

給定一個沒有重復元素的數組,寫出生成這個數組的MaxTree的函數

題目&#xff1a; 給定一個沒有重復元素的數組arr&#xff0c;寫出生成這個數組的MaxTree的 函數&#xff0c;要求如果數組長度為N&#xff0c;則時間復雜度為O(N)、額外空間復雜度 為O(N)。 一個數組的MaxTree定義如下。 ● 數組必須沒有重復元素。 ● MaxTree是一棵二叉…

iOS 抓包實戰:時間戳偏差導致的數據同步異常排查記錄

“這條數據不是我填的”“我的更新被覆蓋了”“兩個設備顯示不一致”——這些是產品上線后最令人頭疼的反饋。 最近我們在一次用戶同步問題排查中&#xff0c;發現表面是“數據丟失”問題&#xff0c;實則是多端數據提交時間戳處理不一致&#xff0c;導致后臺認為老數據為新&a…

一款支持多日志器、多級別、多落地方式的同異步日志系統

文章目錄 簡介項目特點項目實現基礎功能模塊實現文件操作以及日期時間獲取日志等級日志信息描述 異步功能模塊實現緩沖區實現異步線程實現 核心功能模塊實現日志格式解析落地操作實現日志器實現 測試測試環境測試參數測試結果性能分析 附件 簡介 在現代軟件開發與系統運維領域…

加固筆記本在戶外勘探行業的應用:探索與科技的融合

在自然資源勘探、地質調查、石油天然氣開發、礦產資源測繪等戶外勘探行業中&#xff0c;作業環境常常復雜多變&#xff1a;風沙漫天的戈壁、雨雪交加的山區、濕熱潮濕的叢林&#xff0c;甚至是極寒與高溫并存的極端氣候條件。面對這些挑戰&#xff0c;普通的辦公設備早已無法勝…

MySQL 連接指定端口后,為什么實際仍是 3306?

文章目錄 MySQL 連接指定端口后&#xff0c;為什么實際仍是 3306&#xff1f;問題現象復現原因分析沒有指定 -h&#xff0c;默認走的是本地 Unix Socket多實例環境中未顯式指定目標地址 正確的連接方法方法一&#xff1a;添加 -h 127.0.0.1方法二&#xff1a;添加 --protocolTC…

【Android當用戶兩次打斷息屏操作后,屏幕將會在10分鐘內無法熄滅并持續點亮(關閉Android13新增的dim功能)】

UndimDetectorWakeLock持鎖導致屏幕不滅問題處理SOP 問題描述 在Android T版本中&#xff0c;系統新增了SCREEN_BRIGHT_WAKE_LOCK&#xff08;UndimDetectorWakeLock&#xff09;機制。當設備處于低亮度&#xff08;dim&#xff09;狀態時&#xff0c;用戶兩次打斷屏幕熄滅操…