練習題(2024/5/12)

1二分查找

給定一個?n?個元素有序的(升序)整型數組?nums?和一個目標值?target??,寫一個函數搜索?nums?中的?target,如果目標值存在返回下標,否則返回?-1


示例 1:

輸入: nums = [-1,0,3,5,9,12], target = 9
輸出: 4
解釋: 9 出現在 nums 中并且下標為 4

示例?2:

輸入: nums = [-1,0,3,5,9,12], target = 2
輸出: -1
解釋: 2 不存在 nums 中因此返回 -1

提示:

  1. 你可以假設?nums?中的所有元素是不重復的。
  2. n?將在?[1, 10000]之間。
  3. nums?的每個元素都將在?[-9999, 9999]之間。

思路:

  1. 確定初始搜索區間:將左邊界?left?設置為數組起始索引,右邊界?right?設置為數組末尾索引。
  2. 使用循環進行搜索:只要左邊界?left?小于或等于右邊界?right,就繼續搜索。這是因為當左邊界和右邊界相等時,區間仍然有效,可能存在目標值。
  3. 計算中間索引:通過?left + ((right - left) / 2)?來計算中間索引,這樣做是為了防止整數溢出,與直接使用?(left + right) / 2?相比更安全。
  4. 比較中間值和目標值:將中間索引對應的值與目標值進行比較。
  5. 根據比較結果更新搜索區間:
    • 如果中間值大于目標值,則目標值在左側,更新右邊界為?middle - 1
    • 如果中間值小于目標值,則目標值在右側,更新左邊界為?middle + 1
    • 如果中間值等于目標值,則找到目標值,直接返回中間索引。
  6. 若循環結束仍未找到目標值,則返回 -1,表示目標值不存在于數組中。

代碼:

class Solution {
public:int search(vector<int>& nums, int target) {int left = 0;int right = nums.size() - 1; // 定義target在左閉右閉的區間里,[left, right]while (left <= right) { // 當left==right,區間[left, right]依然有效,所以用 <=int middle = left + ((right - left) / 2);// 防止溢出 等同于(left + right)/2if (nums[middle] > target) {right = middle - 1; // target 在左區間,所以[left, middle - 1]} else if (nums[middle] < target) {left = middle + 1; // target 在右區間,所以[middle + 1, right]} else { // nums[middle] == targetreturn middle; // 數組中找到目標值,直接返回下標}}// 未找到目標值return -1;}
};

2反轉字符串 II

編寫一個函數,其作用是將輸入的字符串反轉過來。輸入字符串以字符數組?s?的形式給出。

不要給另外的數組分配額外的空間,你必須原地修改輸入數組、使用 O(1) 的額外空間解決這一問題。

示例 1:

輸入:s = ["h","e","l","l","o"]
輸出:["o","l","l","e","h"]

示例 2:

輸入:s = ["H","a","n","n","a","h"]
輸出:["h","a","n","n","a","H"]

提示:

  • 1 <= s.length <= 105
  • s[i]?都是?ASCII?碼表中的可打印字符

思路:

  1. 使用循環遍歷字符串,每次步長為 2k,以便處理每個分段。
  2. 對于每個分段:
    • 如果剩余字串長度大于等于 k,則反轉前 k 個字符。
    • 如果剩余字串長度小于 k,則反轉剩余所有字符。
  3. 將反轉后的字符串返回。

代碼:

class Solution {
public:string reverseStr(string s, int k) {for(int i=0;i<s.size();i+=2*k){ // 每次移動步長為 2kif(i+k<=s.size()){ // 如果剩余字串長度大于等于 k,則反轉前 k 個字符reverse(s.begin()+i,s.begin()+i+k);}else{ // 如果剩余字串長度小于 k,則反轉剩余所有字符reverse(s.begin()+i,s.end());}}return s;}
};

3替換數字(第八期模擬筆試)

給定一個字符串 s,它包含小寫字母和數字字符,請編寫一個函數,將字符串中的字母字符保持不變,而將每個數字字符替換為number。

例如,對于輸入字符串 "a1b2c3",函數應該將其轉換為 "anumberbnumbercnumber"。

對于輸入字符串 "a5b",函數應該將其轉換為 "anumberb"

輸入:一個字符串 s,s 僅包含小寫字母和數字字符。

輸出:打印一個新的字符串,其中每個數字字符都被替換為了number

樣例輸入:a1b2c3

樣例輸出:anumberbnumbercnumber

數據范圍:1 <= s.length < 10000。

思路:

解題思路主要集中在字符串的遍歷和替換過程:

  1. 遍歷字符串并統計數字個數:?使用一個循環遍歷輸入的字符串,每當遇到一個數字字符,就將計數器?count?加一。

  2. 擴充字符串大小:?統計完數字個數后,需要將字符串的大小擴充,以便容納替換后的 “number”。由于每個數字都會替換成 “number”,所以字符串大小需要增加?count * 5

  3. 從后往前替換數字為 “number”:?從原始字符串的末尾開始向前遍歷,如果遇到數字字符,則依次將 “number” 替換進去;如果遇到非數字字符,則直接復制到新字符串中。這里需要維護好原始字符串和新字符串的索引關系,確保替換操作正確進行。

  4. 輸出替換后的字符串:?完成替換后,輸出新的字符串即可。

代碼:

#include <iostream>
using namespace std;int main() {string s; // 定義字符串變量while (cin >> s) { // 循環讀取輸入的字符串int sOldIndex = s.size() - 1; // 記錄原始字符串最后一個字符的索引int count = 0; // 統計數字的個數for (int i = 0; i < s.size(); i++) { // 遍歷字符串if (s[i] >= '0' && s[i] <= '9') { // 如果當前字符是數字count++; // 數字個數加一}}// 擴充字符串 s 的大小,也就是將每個數字替換成 "number" 之后的大小s.resize(s.size() + count * 5);int sNewIndex = s.size() - 1; // 新字符串的最后一個字符的索引// 從后往前將數字替換為 "number"while (sOldIndex >= 0) { // 從原始字符串的末尾開始遍歷if (s[sOldIndex] >= '0' && s[sOldIndex] <= '9') { // 如果當前字符是數字s[sNewIndex--] = 'r'; // 替換為 'r's[sNewIndex--] = 'e'; // 替換為 'e's[sNewIndex--] = 'b'; // 替換為 'b's[sNewIndex--] = 'm'; // 替換為 'm's[sNewIndex--] = 'u'; // 替換為 'u's[sNewIndex--] = 'n'; // 替換為 'n'} else { // 如果當前字符不是數字s[sNewIndex--] = s[sOldIndex]; // 不變,直接復制}sOldIndex--; // 原始字符串索引向前移動}cout << s << endl; // 輸出替換后的字符串       }
}

4反轉鏈表

給你單鏈表的頭節點?head?,請你反轉鏈表,并返回反轉后的鏈表。

示例 1:

輸入:head = [1,2,3,4,5]
輸出:[5,4,3,2,1]

示例 2:

輸入:head = [1,2]
輸出:[2,1]

示例 3:

輸入:head = []
輸出:[]

提示:

  • 鏈表中節點的數目范圍是?[0, 5000]
  • -5000 <= Node.val <= 5000

思路:

cur?和?pre?兩個指針構成了雙指針的思路,用來實現鏈表的反轉。

  • cur?指針是當前遍歷到的節點,初始時指向頭節點?head
  • pre?指針是?cur?的前一個節點,在循環中起到了記錄已經反轉部分的作用。

每次循環中的操作主要包括:

  1. 將?temp?指針指向?cur?的下一個節點,以便在修改?cur->next?后能找到下一個節點。
  2. 將?cur->next?指向?pre,實現當前節點的反轉。
  3. 更新?pre?和?cur?指針,將?pre?移向?cur?的位置,將?cur?移向?temp?的位置

代碼:

class Solution {
public:ListNode* reverseList(ListNode* head) {ListNode* temp; // 保存cur的下一個節點ListNode* cur = head;ListNode* pre = NULL;while(cur) {temp = cur->next;  // 保存一下 cur的下一個節點,因為接下來要改變cur->nextcur->next = pre; // 翻轉操作// 更新pre 和 cur指針pre = cur;cur = temp;}return pre;}
};

5求關注者的數量

表:?Followers

+-------------+------+
| Column Name | Type |
+-------------+------+
| user_id     | int  |
| follower_id | int  |
+-------------+------+
(user_id, follower_id) 是這個表的主鍵(具有唯一值的列的組合)。
該表包含一個關注關系中關注者和用戶的編號,其中關注者關注用戶。

編寫解決方案,對于每一個用戶,返回該用戶的關注者數量。

按?user_id?的順序返回結果表。

查詢結果的格式如下示例所示。

示例 1:

輸入:
Followers 表:
+---------+-------------+
| user_id | follower_id |
+---------+-------------+
| 0       | 1           |
| 1       | 0           |
| 2       | 0           |
| 2       | 1           |
+---------+-------------+
輸出:
+---------+----------------+
| user_id | followers_count|
+---------+----------------+
| 0       | 1              |
| 1       | 1              |
| 2       | 2              |
+---------+----------------+
解釋:
0 的關注者有 {1}
1 的關注者有 {0}
2 的關注者有 {0,1}

代碼:

select user_id,count(follower_id) followers_count
from Followers 
group by user_id
order by user_id asc;

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

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

相關文章

樹莓派C語言開發

安裝C語言編譯器和開發工具 sudo apt update sudo apt install build-essential 此命令會安裝GCC編譯器以及make等其他工具&#xff0c;這些都是C語言程序開發過程中必需的。 配置文本編輯器 樹莓派默認安裝了幾個文本編輯器&#xff0c;如Nano和Vim。如果你對這些編輯器不熟…

如何遠程訪問?

遠程訪問是指在不同的地理位置之間通過網絡連接來實現對目標設備或系統的訪問。無論是在個人生活還是商業領域&#xff0c;遠程訪問都起到了重要的作用&#xff0c;幫助人們實現高效的工作和便捷的生活。本文將介紹一款名為【天聯】的組網產品&#xff0c;它是一款強大的異地組…

Linux與Windows互傳文件【筆記】

Linux與Windows互傳文件【筆記】 前言前言推薦Linux與Windows互傳文件首先確保Windows安裝ssh如何傳送文件問題 最后 前言 這是陳舊已久的草稿2023-05-10 00:01:24 這個是準備把計組課程華為智能計組的&#xff0c;傳輸文件。 最后發現&#xff0c;好像沒有實現了。 現在202…

汽車線控轉向系統介紹

汽車線控轉向系統由方向盤總成、轉向執行總成和主控制器(ECU)三個主要部分以及自動防故障系統、電源等輔助系統組成。 線控轉向系統(Steering-By-Wire)&#xff0c;取消了方向盤和轉向車輪之間的機械連接部件&#xff0c;徹底擺脫了機械固件的限制&#xff0c;完全由電能來實現…

【LeetCode】數組——hashmap的妙用

在遇到一類題目時&#xff0c;通過雙for循環也可暴力破解&#xff0c;但我們可以通過用hashmap來代替一次for循環節約時間開支&#xff0c;在算法上屬于用空間換時間&#xff0c;也能幫助我們更好的理解hashmap這一種重要數據結構&#xff0c;并熟悉hashmap的重要方法。 1.兩數…

31Windows精簡系統下載推薦

Windows精簡系統下載推薦 世界上有很多人在做Windows精簡系統&#xff0c;去掉了他們認為不必要的功能和插件&#xff0c;達到了減小系統安裝包體積&#xff0c;提升系統運行流暢度和穩定性的目的。 筆者推薦使用大佬不忘初心制作的精簡版系統&#xff0c;最精簡windows10系統安…

什么是數據平臺——企業構建Data+AI的基礎數據底座需要的決策參考

什么是數據平臺 標準的解釋是這樣的 Wikipedia A data platform usually refers to a software platform used for collecting and managing data, and acting as a data delivery point for application and reporting software. 數據平臺是指將各類數據進行整合、存儲、處…

你知道C++多少——默認成員函數

&#x1f308;個人主頁&#xff1a;小新_- &#x1f388;個人座右銘&#xff1a;“成功者不是從不失敗的人&#xff0c;而是從不放棄的人&#xff01;”&#x1f388; &#x1f381;歡迎各位→點贊&#x1f44d; 收藏?? 留言&#x1f4dd; &#x1f3c6;所屬專欄&#xff1…

Python vs MATLAB:選擇深度學習的首選編程語言

Python vs MATLAB&#xff1a;選擇深度學習的首選編程語言 在深度學習領域&#xff0c;編程語言的選擇對于初學者的學習路徑和未來的職業發展至關重要。目前&#xff0c;Python和MATLAB都是進行科學計算和數據分析的流行工具&#xff0c;但它們在深度學習社區中的應用和受歡迎…

linux程序分析命令(一)

linux程序分析命令(一) **ldd&#xff1a;**用于打印共享庫依賴。這個命令會顯示出一個可執行文件所依賴的所有共享庫&#xff08;動態鏈接庫&#xff09;&#xff0c;這對于解決運行時庫依賴問題非常有用。**nm&#xff1a;**用于列出對象文件的符號表。這個命令可以顯示出定…

什么事防抖和節流,有什么區別,如何實現

防抖和節流&#xff0c;本質上是優化高頻率執行代碼的一種手段&#xff0c;比如&#xff1a;resize、scroll、keypress、mousemove這些事件在觸發的時候&#xff0c;會不斷調用綁定在事件上的回調函數&#xff0c;這樣極大浪費資源&#xff0c;降低前端性能。 為了優化體驗&am…

ipa 分區算法分析,圖解

參考 Room Segmentation: Survey, Implementation, and Analysis. 分區算法調查&#xff0c;實現以及評估對比 相關論文 分區算法 New Brooms Sweep Clean - An Autonomous Robotic Cleaning Assistant for Professional Office Cleaning 形態分割 Interactive SLAM using …

函數原型(Function Prototype)、函數定義(Function Definition)和函數聲明(Function Declaration)

函數原型&#xff08;Function Prototype&#xff09;、函數定義&#xff08;Function Definition&#xff09;和函數聲明&#xff08;Function Declaration&#xff09;在C和C等編程語言中扮演著不同的角色&#xff0c;但它們有時在概念上可能會有些重疊。下面是它們之間的主要…

NOR FLASH介紹

參考 http://t.csdnimg.cn/gHcrG 一、NOR FLASH簡介 XIP技術:https://blog.csdn.net/ffdia/article/details/87437872?fromshareblogdetail NOR Flash 和 NAND Flash 的特點和應用舉例&#xff1a; NOR Flash&#xff1a; 特點&#xff1a; 支持隨機訪問&#xff0c;可以直接…

QT作業4

1、思維導圖 2、使用定時器完成鬧鐘 頭文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QLineEdit> #include <QLabel> #include <QPushButton> #include <QTextEdit> #include <QDebug> #include <…

收集郵票C++題目【概率期望DP+數學推導】

題意 Description 有 n n n 種不同的郵票&#xff0c;皮皮想收集所有種類的郵票。唯一的收集方法是到同學凡凡那里購買&#xff0c;每次只能買一張&#xff0c;并且 買到的郵票究竟是 n n n 種郵票中的哪一種是等概率的&#xff0c;概率均為 1 n \frac{1}{n} n1?。但是由…

【elasticsearch】慢查詢替代查詢審計的嘗試

【elasticsearch】慢查詢替代查詢審計的嘗試 使用了es有兩年了&#xff0c;突然發現一個&#xff0c;es沒有查詢審計日志&#xff0c;某個用戶查詢了某個索引的審計。 找了官方文檔和社區的回復都是說使用slow log替代慢查詢。 嘗試一下。 參考鏈接1&#xff1a;https://discus…

Py深度學習基礎|關于Batch Normalization

1. 為什么需要Batch Normalization 通常我們會在輸入層進行數據的標準化處理&#xff0c;這是為了讓模型學習到更好的特征。同樣&#xff0c;在模型的中間層我們也可以進行normalize。在神經網絡中, 數據分布對訓練會產生影響。 比如我們使用tanh作為激活函數&#xff0c;當輸入…

Baidu Comate智能編碼助手:AI編程時代提升效率的好幫手

目錄 寫在前面一、如何安裝二、如何使用場景需求體驗步驟 三、AI 編程實戰指令功能插件功能知識庫功能 四、問題建議五、體驗總結&#x1f680;寫在最后 寫在前面 Baidu Comate 是基于文心大模型的 AI編程工具&#xff0c;它結合百度積累多年的編程現場大數據和外部優秀開源數據…

MySQL中的多表查詢

數據庫設計范式(范例) 好的數據庫設計&#xff0c;事倍功半&#xff0c;不會有歧義 第一范式&#xff1a;列保證原子性&#xff08;列不可再分解&#xff09; 聯系方式&#xff1a;電話&#xff0c;微信&#xff0c;QQ&#xff0c;郵箱 這些都不可分解 第二范式&#xff1a;要…