練習題(2024/5/16)

1輪轉數組

給定一個整數數組?nums,將數組中的元素向右輪轉?k?個位置,其中?k?是非負數。

示例 1:

輸入: nums = [1,2,3,4,5,6,7], k = 3
輸出: [5,6,7,1,2,3,4]
解釋:
向右輪轉 1 步: [7,1,2,3,4,5,6]
向右輪轉 2 步: [6,7,1,2,3,4,5]
向右輪轉 3 步: [5,6,7,1,2,3,4]

示例?2:

輸入:nums = [-1,-100,3,99], k = 2
輸出:[3,99,-1,-100]
解釋: 
向右輪轉 1 步: [99,-1,-100,3]
向右輪轉 2 步: [3,99,-1,-100]

提示:

  • 1 <= nums.length <= 105
  • -231 <= nums[i] <= 231 - 1
  • 0 <= k <= 105

思路:

1. 對于給定的 k,先將其對數組長度取模,以處理 k 大于數組長度的情況。

2. 首先將整個數組進行反轉,此時原數組中的最后 k 個元素會被移動到數組的開頭。

3. 然后再將前 k 個元素進行反轉,將其移動到數組末尾,此時數組中的元素順序已經符合旋轉后的要求。

4. 最后,對數組中剩余的元素進行反轉,以將其移動到數組的前面。

代碼:

class Solution {
public:void rotate(vector<int>& nums, int k) {// 對 k 取模,以處理 k 大于數組長度的情況k = k % nums.size();// 將整個數組反轉reverse(nums.begin(), nums.end());// 反轉前 k 個元素,將它們移動到數組末尾reverse(nums.begin(), nums.begin() + k);// 反轉剩余元素,將它們移到數組前面reverse(nums.begin() + k, nums.end());}
};

2反轉字符串中的單詞

給你一個字符串?s?,請你反轉字符串中?單詞?的順序。

單詞?是由非空格字符組成的字符串。s?中使用至少一個空格將字符串中的?單詞?分隔開。

返回?單詞?順序顛倒且?單詞?之間用單個空格連接的結果字符串。

注意:輸入字符串?s中可能會存在前導空格、尾隨空格或者單詞間的多個空格。返回的結果字符串中,單詞間應當僅用單個空格分隔,且不包含任何額外的空格。

示例 1:

輸入:s = "the sky is blue"
輸出:"blue is sky the"

示例 2:

輸入:s = " ?hello world ?"
輸出:"world hello"
解釋:反轉后的字符串中不能存在前導空格和尾隨空格。

示例 3:

輸入:s = "a good ? example"
輸出:"example good a"
解釋:如果兩個單詞間有多余的空格,反轉后的字符串需要將單詞間的空格減少到僅有一個。

提示:

  • 1 <= s.length <= 104
  • s?包含英文大小寫字母、數字和空格?' '
  • s?中?至少存在一個?單詞

思路:

  1. reverse?函數用于翻轉字符串的指定區間,采用左閉右閉的區間寫法。
  2. removeExtraSpaces?函數用于去除字符串中的多余空格,通過定義快指針和慢指針,將冗余空格移除。
  3. reverseWords?函數首先調用?removeExtraSpaces?去除多余空格,然后將整個字符串進行翻轉。
  4. 遍歷字符串,當遇到空格或字符串末尾時,表示一個單詞結束,對該單詞進行翻轉。
  5. 最后返回翻轉后的字符串。

代碼:

class Solution {
public:void reverse(string& s, int start, int end){ //翻轉,區間寫法:左閉右閉 []for (int i = start, j = end; i < j; i++, j--) {swap(s[i], s[j]);}}
void removeExtraSpaces(string& s) {int slowIndex = 0, fastIndex = 0; // 定義快指針,慢指針// 去掉字符串前面的空格while (s.size() > 0 && fastIndex < s.size() && s[fastIndex] == ' ') {fastIndex++;}for (; fastIndex < s.size(); fastIndex++) {// 去掉字符串中間部分的冗余空格if (fastIndex - 1 > 0&& s[fastIndex - 1] == s[fastIndex]&& s[fastIndex] == ' ') {continue;} else {s[slowIndex++] = s[fastIndex];}}if (slowIndex - 1 > 0 && s[slowIndex - 1] == ' ') { // 去掉字符串末尾的空格s.resize(slowIndex - 1);} else {s.resize(slowIndex); // 重新設置字符串大小}
}string reverseWords(string s) {removeExtraSpaces(s); //去除多余空格,保證單詞之間之只有一個空格,且字符串首尾沒空格。reverse(s, 0, s.size() - 1);int start = 0; //removeExtraSpaces后保證第一個單詞的開始下標一定是0。for (int i = 0; i <= s.size(); ++i) {if (i == s.size() || s[i] == ' ') { //到達空格或者串尾,說明一個單詞結束。進行翻轉。reverse(s, start, i - 1); //翻轉,注意是左閉右閉 []的翻轉。start = i + 1; //更新下一個單詞的開始下標start}}return s;}
};

3尋找數組的中心下標

給你一個整數數組?nums?,請計算數組的?中心下標?

數組?中心下標?是數組的一個下標,其左側所有元素相加的和等于右側所有元素相加的和。

如果中心下標位于數組最左端,那么左側數之和視為?0?,因為在下標的左側不存在元素。這一點對于中心下標位于數組最右端同樣適用。

如果數組有多個中心下標,應該返回?最靠近左邊?的那一個。如果數組不存在中心下標,返回?-1?。

示例 1:

輸入:nums = [1, 7, 3, 6, 5, 6]
輸出:3
解釋:
中心下標是 3 。
左側數之和 sum = nums[0] + nums[1] + nums[2] = 1 + 7 + 3 = 11 ,
右側數之和 sum = nums[4] + nums[5] = 5 + 6 = 11 ,二者相等。

示例 2:

輸入:nums = [1, 2, 3]
輸出:-1
解釋:
數組中不存在滿足此條件的中心下標。

示例 3:

輸入:nums = [2, 1, -1]
輸出:0
解釋:
中心下標是 0 。
左側數之和 sum = 0 ,(下標 0 左側不存在元素),
右側數之和 sum = nums[1] + nums[2] = 1 + -1 = 0 。

提示:

  • 1 <= nums.length <= 104
  • -1000 <= nums[i] <= 1000

思路:

  1. 遍歷一遍數組,計算數組所有元素的總和。
  2. 定義左半部分的和和右半部分的和,初始值均為0。
  3. 遍歷數組,累加左半部分的和,并計算右半部分的和。
  4. 若左半部分和右半部分相等,則當前索引為中心索引,返回該索引值。
  5. 若遍歷結束仍未找到中心索引,則返回 -1。

代碼:

class Solution {
public:int pivotIndex(vector<int>& nums) {int sum=0;for(int num:nums) sum+=num; // 計算數組總和int leftsum=0; // 左半部分的和int rightsum=0; // 右半部分的和for(int i=0;i<nums.size();i++){leftsum +=nums[i]; // 左半部分累加當前元素rightsum = sum-leftsum + nums[i]; // 總和減去左半部分,再加上當前元素,得到右半部分的和if(leftsum==rightsum) return i; // 如果左半部分和右半部分相等,則當前索引為中心索引} return -1; // 若不存在中心索引,則返回 -1}
};

4在排序數組中查找元素的第一個和最后一個位置

給你一個按照非遞減順序排列的整數數組?nums,和一個目標值?target。請你找出給定目標值在數組中的開始位置和結束位置。

如果數組中不存在目標值?target,返回?[-1, -1]

你必須設計并實現時間復雜度為?O(log n)?的算法解決此問題。

示例 1:

輸入:nums = [5,7,7,8,8,10], target = 8
輸出:[3,4]

示例?2:

輸入:nums = [5,7,7,8,8,10], target = 6
輸出:[-1,-1]

示例 3:

輸入:nums = [], target = 0
輸出:[-1,-1]

提示:

  • 0 <= nums.length <= 105
  • -109?<= nums[i]?<= 109
  • nums?是一個非遞減數組
  • -109?<= target?<= 109

思路:

尋找target在數組里的左右邊界,有如下三種情況:

  • 情況一:target 在數組范圍的右邊或者左邊,例如數組{3, 4, 5},target為2或者數組{3, 4, 5},target為6,此時應該返回{-1, -1}
  • 情況二:target 在數組范圍中,且數組中不存在target,例如數組{3,6,7},target為5,此時應該返回{-1, -1}
  • 情況三:target 在數組范圍中,且數組中存在target,例如數組{3,6,7},target為6,此時應該返回{1, 1}
  1. 尋找左邊界和右邊界:我們可以通過兩次二分查找來找到目標值在數組中的左邊界和右邊界。對于尋找左邊界,我們調整二分查找的條件,當?nums[middle] >= target?時更新右邊界,當?nums[middle] < target?時更新左邊界;對于尋找右邊界,我們調整二分查找的條件,當?nums[middle] > target?時更新右邊界,當?nums[middle] <= target?時更新左邊界。

  2. 情況判斷:根據左右邊界的情況,我們可以判斷出目標值在數組中的情況。如果左右邊界中任一為-2,則表示目標值不存在,返回{-1, -1};如果左右邊界相差大于1,則表示目標值存在且范圍大于1,返回范圍內的左右邊界;如果左右邊界相差為1或未找到目標值,則返回{-1, -1}。

代碼:

class Solution {
public:vector<int> searchRange(vector<int>& nums, int target) {int leftBorder = getLeftBorder(nums, target); // 獲取左邊界int rightBorder = getRightBorder(nums, target); // 獲取右邊界// 情況一:沒有找到目標值,返回{-1, -1}if (leftBorder == -2 || rightBorder == -2) return {-1, -1};// 情況三:找到了目標值并且范圍大于1,返回范圍內的左右邊界if (rightBorder - leftBorder > 1) return {leftBorder + 1, rightBorder - 1};// 情況二:找到了目標值但范圍為1或未找到,返回{-1, -1}return {-1, -1};}
private:int getRightBorder(vector<int>& nums, int target) {int left = 0;int right = nums.size() - 1;int rightBorder = -2; // 記錄一下rightBorder沒有被賦值的情況while (left <= right) {int middle = left + ((right - left) / 2);if (nums[middle] > target) {right = middle - 1;} else { // 尋找右邊界,nums[middle] == target的時候更新leftleft = middle + 1;rightBorder = left;}}return rightBorder;}int getLeftBorder(vector<int>& nums, int target) {int left = 0;int right = nums.size() - 1;int leftBorder = -2; // 記錄一下leftBorder沒有被賦值的情況while (left <= right) {int middle = left + ((right - left) / 2);if (nums[middle] >= target) { // 尋找左邊界,nums[middle] == target的時候更新rightright = middle - 1;leftBorder = right;} else {left = middle + 1;}}return leftBorder;}
};

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

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

相關文章

【C語言深度解剖】:(11)函數指針、函數指針數組、指向函數指針數組的指針、回調函數

&#x1f921;博客主頁&#xff1a;醉竺 &#x1f970;本文專欄&#xff1a;《C語言深度解剖》《精通C指針》 &#x1f63b;歡迎關注&#xff1a;感謝大家的點贊評論關注&#xff0c;祝您學有所成&#xff01; ??&#x1f49c;&#x1f49b;想要學習更多C語言深度解剖點擊專欄…

AVDemo漏洞平臺黑盒測試

信息收集 說明一下&#xff1a; 因為是本地的環境&#xff0c;端口這些就不掃描了&#xff0c; 還有這個是某個dalao寫的平臺&#xff0c;也就檢測不到什么cms了&#xff0c; 信息收集&#xff0c;端口&#xff0c;cms這些是必做的&#xff0c; 首先&#xff0c;這里先簡單的…

web3 ETF軟件開發難點

開發一個涉及到 Web3 ETF&#xff08;Exchange-Traded Fund&#xff0c;交易所交易基金&#xff09;的軟件可能會面臨一些挑戰和難點&#xff0c;特別是在整合 Web3 技術和金融服務方面。以下是一些可能的難點。北京木奇移動技術有限公司&#xff0c;專業的軟件外包開發公司&am…

記一次:mysql統計的CAST函數與json字段中的某個字段

前言&#xff1a;因為需求的問題&#xff0c;會遇到將某個json存入到一個字段中&#xff0c;但在統計的時候&#xff0c;又需要將這個json中的某個字段作為條件來統計&#xff0c;所以整理了一下cast函數和json中某個字段的條件判斷 一、淺談mysql的json 1.1 上例子 SELECTli…

植物大戰僵尸雜交版(含下載方式)

最近時間&#xff0c;一款很火的植物大戰僵尸雜交版火爆出圈&#xff0c;在玩家之間瘋狂擴散。各種奇特的雜交組合讓游戲變得更加有趣。 游戲介紹 植物大戰僵尸雜交版是一款將《植物大戰僵尸》和植物雜交概念結合在一起的獨特塔防策略游戲。它將《植物大戰僵尸》中的植物與進行…

什么是析構函數?

在編程語言C中&#xff0c;析構函數是一個特別重要的組件&#xff0c;它主要負責在對象生命周期結束時釋放資源和執行清理任務。析構函數的正確實現對于資源管理尤為關鍵&#xff0c;尤其是在處理動態分配內存、文件句柄、網絡連接或其他系統資源時。本文將詳細介紹析構函數的基…

Minio 對象存儲 OSS概述

系列文章目錄 第五章 Minio 對象存儲 OSS概述 Minio 對象存儲 OSS概述 系列文章目錄對象存儲 OSS基本概念存儲空間&#xff08;Bucket&#xff09;對象&#xff08;Object&#xff09;ObjectKeyRegion&#xff08;地域&#xff09;Endpoint&#xff08;訪問域名&#xff09;Ac…

C#知識|上位機子窗體嵌入主窗體方法(實例)

哈嘍,你好啊,我是雷工! 上位機開發中,經常會需要將子窗體嵌入到主窗體, 本節練習C#中在主窗體的某個容器中打開子窗體的方法。 01 需求說明 本節練習將【賬號管理】子窗體在主窗體的panelMain容器中打開。 賬號管理子窗體如下: 主窗體的panelMain容器位置如圖: 02 實現…

一次JAVA接口優化記錄

目錄 一次接口優化記錄首先考慮&#xff0c;添加緩存緩存策略方案一&#xff1a;本地緩存方案二&#xff1a;Redis緩存 優化結果原因分析&#xff1a;原因驗證 接口數據分析將響應數據返回大小減少compression壓縮配置完美&#xff08;代指這里的小系統&#xff09; 一次接口優…

CentOS 的常見命令

CentOS 是一種廣泛使用的 Linux 發行版&#xff0c;特別在服務器環境中。本文將詳細介紹 CentOS 中常見的命令&#xff0c;以便幫助用戶在操作系統中有效地進行各種操作。下面介紹一下文件和目錄操作、用戶和權限管理、系統信息查看、軟件包管理以及網絡配置等方面的命令。 一…

應用層協議【HTTP和HTTPS】

1.概念 1.1 協議 協議是指在計算機通信和網絡通信中&#xff0c;為了實現數據交換而建立的一套規則、約定或者標準。它定義了通信雙方之間的通信格式、傳輸方式、數據的含義、錯誤處理等細節&#xff0c;從而確保通信的可靠性、有效性和安全性。 >1在計算機網絡中&#x…

Python簡易圖書管理系統重構

在本篇課文中&#xff0c;我們將使用Python語言結合MySQL數據庫&#xff0c;從零開始構建一個簡單的圖書管理系統。該系統旨在幫助圖書館管理員輕松管理圖書的借閱、歸還以及查詢圖書信息等日常操作。我們將分步介紹需求分析、數據庫設計、環境搭建、功能實現等關鍵環節&#x…

注冊講堂 | 體外診斷試劑分類目錄的變化

5月11日&#xff0c;千呼萬喚的《體外診斷試劑分類目錄》&#xff08;2024年第58號&#xff09;終于發布&#xff01; 前世今生 2013年&#xff1a;《6840 體外診斷試劑分類子目錄&#xff08;2013版&#xff09;》&#xff08;以下簡稱2013版目錄&#xff09; 2017年&#xff…

蘋果永久版安裝PD虛擬機:Parallels Desktop 19 一鍵激活版

Parallels Desktop 19是一款功能強大的虛擬機軟件&#xff0c;專為Mac用戶設計&#xff0c;允許用戶在同一臺Mac電腦上同時運行Windows、Linux等多個操作系統&#xff0c;而無需額外的硬件設備。 下載地址&#xff1a;https://www.macz.com/mac/9581.html?idOTI2NjQ5Jl8mMjcuM…

Kubernetes入門:核心概念

集群架構與組件 一個kubernetes集群主要是由控制節點(master)、工作節點(node)構成&#xff0c;每個節點上都會安裝不同的組件。 master&#xff1a;集群的控制平面&#xff0c;負責集群的決策 ( 管理 ) api-server : 資源操作的唯一入口&#xff0c;接收用戶輸入的命令&…

vue3 項目中 前端實現下載模板 csv文件

做項目時遇到讓前端實現模板下載功能&#xff0c;第一次碰到這種需求&#xff0c;記錄一下。 下載csv 模板&#xff1a; <el-button type"primary" click"download(data/CSVXX.csv)">下載模板</el-button> const download (url) > {con…

文本控件Text Control示例: 將圖像插入 TX 的各種方法

TX Text Control 是一款功能類似于 MS Word 的文字處理控件&#xff0c;包括文檔創建、編輯、打印、郵件合并、格式轉換、拆分合并、導入導出、批量生成等功能。廣泛應用于企業文檔管理&#xff0c;網站內容發布&#xff0c;電子病歷中病案模板創建、病歷書寫、修改歷史、連續打…

在Linux上面部署ELK

注明&#xff1a;一下的軟件需要自己準備 一、準備環境&#xff1a; 1.兩臺elasticsearch主機4G內存 2.兩臺elasticsearch配置主機名node1和node2(可以省略) #vim /etc/hostname #reboot 3. 兩臺elasticsearch配置hosts文件 #vim /etc/hosts 192.168.1.1 node1 192…

RTMP低延遲推流

人總是需要壓力才能進步, 最近有個項目, 需要我在RK3568上, 推流到公網, 最大程度的降低延遲. 廢話不多說, 先直接看效果: 數據經過WiFi發送到Inenter的SRS服務器, 再通過網頁拉流的. 因為是打金任務, 所以逼了自己一把, 把RTMP推流好好捋一遍. 先說說任務目標, 首先是MPP編碼…