【刷題匯總--字符串中找出連續最長的數字串、島嶼數量、拼三角】

C++日常刷題積累

  • 今日刷題匯總 - day007
    • 1、字符串中找出連續最長的數字串
      • 1.1、題目
      • 1.2、思路
      • 1.3、程序實現 -- 比較
      • 1.4、程序實現 -- 雙指針
    • 2、島嶼數量
      • 2.1、題目
      • 2.2、思路
      • 2.3、程序實現 - dfs
    • 3、拼三角
      • 3.1、題目
      • 3.2、思路
      • 3.3、程序實現 -- 蠻力法
      • 3.4、程序實現 -- 巧解(單調性)
    • 4、題目鏈接

今日刷題匯總 - day007

1、字符串中找出連續最長的數字串

1.1、題目

在這里插入圖片描述

1.2、思路

讀完題知道,需要求一段字符串中最長且是連續的數字字符串。既然涉及到找最長,意味著具有比較關系,所以立馬想到利用一個變量字符串temp進行統計各個連續的數字字符串的長度,最后留取最長retstr的返回即可。另外,還可以利用雙指針,標記每一次出現數字字符的起始位置,然后紀錄其連續的長度,然后返回最長處的其實位置的字串也行。那么。接下來兩個思路都寫一寫吧。

1.3、程序實現 – 比較

首先,我們根據思路和題目定義三個字符串,一個str作為原字符串輸入,一個retstr最后最后的返回字符串,一個temp作為比較retstr更新字符串,接著,開始遍歷str的各個字符,當遇見數字字符,則尾插進temp中,否則,遇見其它字符則比較retstr和temp的長度,如果temp的長度大于retstr時,則保留最長的數字字符串到retstr,否則清空短的字符串temp繼續遇見遍歷到下一個數字字符再次依次尾插連續數字字符統計長度,依次類推,得到最后的最長數字連續字符串retstr輸出即可。

#include <iostream>
#include <string>
using namespace std;bool isNum(char c)
{return c <= '9' && c >= '0';
}int main() {string str;string retstr;string temp;cin >> str;size_t len = str.size();for (int i = 0; i <= len; i++){if (isNum(str[i])){temp += str[i];} else{if (retstr.size() < temp.size())retstr = temp;elsetemp.clear();}}cout << retstr << endl;return 0;
}

在這里插入圖片描述

在這里插入圖片描述

1.4、程序實現 – 雙指針

接下來,雙指針需要利用begin標記遍歷出現數字字符的位置,且定義一個j從begin處開始遍歷連續數字字符串的長度,遇見非數字字符停止,求得 j - i 的長度保存到maxlen中,然后,將 i 置到 j 處繼續遍歷,且每一次標記begin和maxlen保持更新為最長的數字字符串的起始地址和長度即可。最后利用substr輸出指定位置的字串即可。

#include <iostream>
#include <string>
using namespace std;bool isNum(char ch)
{return ('0' <= ch && ch <= '9');
}int main()
{string str;cin >> str;int begin = -1;int maxlen = -1;for(int i = 0;i< str.size();i++){if(isNum(str[i])){int j = i;while(j < str.size() && isNum(str[j]))j++;if(j -i > maxlen){begin = i;maxlen = j-i;}i = j;}     }cout << str.substr(begin, maxlen) << endl;return 0;
}

在這里插入圖片描述

在這里插入圖片描述

2、島嶼數量

2.1、題目

在這里插入圖片描述

2.2、思路

讀完題知道,又是屬于在一個二維數組里進行搜索/擴散/累計啊等問題。那么立馬就想到了深度優先搜索dfs和廣度優先搜索bfs,然后讓我們實現統計,屬于聯通的島嶼(即具有上下左右連通的‘1’)的個數。那么這里就采用dfs解決即可。比之前的腐爛的蘋果和單詞搜索更簡單一些,因為只需要計數即可。接下來,就是程序實現。

2.3、程序實現 - dfs

首先,既然采用dfs把固定的套路和模板先寫上即可。定義m,n計算二維數組的大小,方便稍后遍歷,再定義兩個方向數組dx和dy,接著定義bool類型的vis數組,表示是否已連通。模板寫好,接著就是遍歷二維數組判斷是否是島嶼,是則計數count且dfs搜索上下左右是否連通。連通就規劃為一塊島嶼,否則就繼續遍歷,直到規劃出所有連通的島嶼,規劃出多少那么coun就恰好統計出結果,最后返回count即可。

class Solution {
public:int m,n;int dx[4] = {0,0,1,-1};int dy[4] = {1,-1,0,0};bool vis[201][201] = { false };int solve(vector<vector<char> >& grid){m = grid.size();n = grid[0].size();int count = 0;for(int i = 0;i < m;i++){for(int j = 0;j < n;j++){if(grid[i][j] == '1' && !vis[i][j]){count++;dfs(grid,i,j);}}}return count;}
};

那么,繼續完善dfs函數,其實方法都類似,先進入dfs后標記當前屬于島嶼,再此島嶼基礎上,就是在4個方向上判斷是否是島嶼‘1’且沒有越界且沒有被標記已連通,是則與當前島嶼執行遞歸標記連通,否則周圍就沒有需要連通的島嶼了。

class Solution {
public:int m,n;int dx[4] = {0,0,1,-1};int dy[4] = {1,-1,0,0};bool vis[201][201] = { false };int solve(vector<vector<char> >& grid){m = grid.size();n = grid[0].size();int count = 0;for(int i = 0;i < m;i++){for(int j = 0;j < n;j++){if(grid[i][j] == '1' && !vis[i][j]){count++;dfs(grid,i,j);}}}return count;}void dfs(vector<vector<char> >& grid, int i,int j){vis[i][j] = true;for(int k = 0;k < 4;k++){int x = i + dx[k];int y = j + dy[k];if(x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == '1' && !vis[x][y])dfs(grid,x,y);}}
};

在這里插入圖片描述
在這里插入圖片描述

3、拼三角

3.1、題目

在這里插入圖片描述

3.2、思路

讀完題,理解到讓我們實現在6根木棍中,任選3根木棍來拼接三角形,其次,還得判斷在剩下的3根木棍中是否還能拼接成三角形。如果同時能,則輸出“Yes”,否則輸出"No"即可。由于,只有6根數量級不大,直接嘗試一波蠻力法試試,蠻力法思路就是遍歷每3根都去判斷一下,能夠組成三角形,能則繼續判斷剩下3根是否也能組成三角形,能則輸出“Yes”,如果不能組成三角形那么輸出“No”即可。另外,在寫蠻力法時發現,會有很多的冗余操作和判斷,會發現具有一些特定,即具備判斷的單調性(稍后畫圖理解),所以利用這個特點且只針對這道題,就有了更優解法。其次,看其它大佬也有用dfs的,但是我沒想出來,而且這里用起來很麻煩且邊界不好控制,就不寫dfs了。
那么接下來,就是程序實現。

3.3、程序實現 – 蠻力法

首先,根據蠻力法的思路,具體分為以下幾個步驟:
(1)、首先,先對木棍長度進行排序,目的是簡化,便于邏輯思考下標處理等;
(2)、套三層for循環,遍歷判斷check三角形的性質是否滿足(任意兩邊之和大于第三邊);
(3)、再(2)滿足條件下,繼續判斷剩下check the other three的三根木棍是否滿足三角形性質;
那么,先根據題目要求和思路寫好基本框架,再把數組sort排序,再為了增加代碼閱讀性,我這里采用封裝了CheckTriangles函數單獨處理是否滿足三角形邏輯。

#include <iostream>
#include <algorithm>
using namespace std;bool CheckTriangles(int* arr)
{
}int main()
{int n;cin >> n;while (n--){int arr[6];for (int i = 0; i < 6; i++)cin >> arr[i];sort(arr, arr + 6);//步驟1:排序if (CheckTriangles(arr))cout << "Yes" << endl;elsecout << "No" << endl;}return 0;
}

接著,實現蠻力法遍歷邏輯,先根據三邊需要求和比較的的關系,寫三層for循環,其次,額外封裝了一個isTriangle函數,判斷是否滿足三角形性質,注意哈,這里需要任意兩邊之和大于第三邊為真才滿足哈。

#include <iostream>
#include <algorithm>
using namespace std;bool isTriangle(int a, int b, int c)
{return (a + b > c && a + c > b && b + c > a);
}bool CheckTriangles(int* arr)
{//步驟2:for循環嵌套for (int i = 0; i < 3; i++){for (int j = i + 1; j < 4; j++){for (int k = j + 1; k < 5; k++){//步驟3: Check -- isTriangleif (isTriangle(arr[i], arr[j], arr[k])){//步驟4: Check the other three -- isTriangle}}}}return false;
}int main()
{int n;cin >> n;while (n--){int arr[6];for (int i = 0; i < 6; i++)cin >> arr[i];sort(arr, arr + 6);//步驟1:排序if (CheckTriangles(arr))cout << "Yes" << endl;elsecout << "No" << endl;}return 0;
}

最后一步就是檢查,若步驟3滿足,則剩下的三根木棍是否仍然滿足三角形性質。所以,這里定義Residue[3]表示存放剩余木棍的數組,定義index表示它的下標,方便操作,然后遍歷原數組,把剩下的數組元素,存放進Residue數組,這樣就可以方便把Residue數組每一根木棍一起放進isTriangle進行拼接驗證是否滿足三角形性質,若滿足,則返回ture,否則繼續回到步驟2,繼續遍歷結束為止,直到最后都沒有滿足,則返回false,則main輸出“No”,否則輸出"Yes"即可。

#include <iostream>
#include <algorithm>
using namespace std;bool isTriangle(int a, int b, int c)
{return (a + b > c && a + c > b && b + c > a);
}bool CheckTriangles(int* arr)
{//步驟2:for循環嵌套for (int i = 0; i < 3; i++){for (int j = i + 1; j < 4; j++){for (int k = j + 1; k < 5; k++){//步驟3: Check -- isTriangleif (isTriangle(arr[i], arr[j], arr[k])){//步驟4: Check the other three -- isTriangleint Residue[3];int idx = 0;for (int m = 0; m < 6; m++){if (m != i && m != j && m != k){Residue[idx++] = arr[m];}}if (isTriangle(Residue[0], Residue[1], Residue[2])){return true;}}}}}return false;
}int main()
{int n;cin >> n;while (n--){int arr[6];for (int i = 0; i < 6; i++)cin >> arr[i];sort(arr, arr + 6);//步驟1:排序if (CheckTriangles(arr))cout << "Yes" << endl;elsecout << "No" << endl;}return 0;
}

在這里插入圖片描述
在這里插入圖片描述

3.4、程序實現 – 巧解(單調性)

解法二,基于解法一的情況下,發現此題具有單調性的特點,所以利用這一特點,能夠更快的方便判斷求解。為了更好的理解,畫個圖演示:
在這里插入圖片描述

#include <iostream>
#include <algorithm>
using namespace std;int main()
{int n;cin >> n;while(n--){int arr[6];for(int i = 0;i < 6;i++)cin >> arr[i];sort(arr,arr+6);if(arr[0] + arr[1] > arr[2] && arr[3] + arr[4] > arr[5] ||arr[0] + arr[2] > arr[3] && arr[1] + arr[4] > arr[5] ||arr[0] + arr[3] > arr[4] && arr[1] + arr[2] > arr[5] ||arr[0] + arr[4] > arr[5] && arr[1] + arr[2] > arr[3]){cout << "Yes" << endl;}elsecout << "No" << endl;}return 0;
}

在這里插入圖片描述
在這里插入圖片描述

4、題目鏈接

字符串中找出連續最長的數字串
島嶼數量
拼三角

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

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

相關文章

pwm 呼吸燈(如果燈一直亮或者一直滅)

&#xff08;這個文章收藏在我的csdn keil文件夾下面&#xff09; 如果這樣設置預分頻和計數周期&#xff0c;那么算出來的pwm頻率如下 人眼看起來就只能是一直亮或者滅&#xff0c;因為pwm的頻率太高了&#xff0c;但是必須是頻率夠高&#xff0c;才能實現呼吸燈的緩慢亮緩慢…

SPL-404:如何徹底改變Solana上的NFT與DeFi

在不斷發展的數字資產領域中&#xff0c;非同質化Token&#xff08;NFT&#xff09;已成為一股革命性力量&#xff0c;徹底改變了我們對數字所有權的看法和互動方式。從藝術和收藏品到游戲和虛擬房地產&#xff0c;NFT吸引了創作者、投資者和愛好者的想象力。 本指南將帶您進入…

MySQL數據庫文件在Linux下存放位置

數據庫文件默認在&#xff1a;cd /usr/share/mysql 配置文件默認在&#xff1a;/etc/my.cnf 數據庫目錄&#xff1a;/var/lib/mysql/ 配置文件&#xff1a;/usr/share/mysql(mysql.server命令及配置文件) 相關命令&#xff1a;/usr/bin(mysqladmin、mysqldump等命令)(*mysql的一…

MyBatisPlus-分頁插件的基本使用

目錄 配置插件 使用分頁API 配置插件 首先&#xff0c;要在配置類中注冊MyBatisPlus的核心插件&#xff0c;同時添加分頁插件。&#xff08;可以放到config軟件包下&#xff09; 可以看到&#xff0c;我們定義了一個配置類&#xff0c;在配置類里聲明了一個Bean,這個Bean的名…

排序 -- 計數排序以及對排序的總結

到了這篇文章就說明常見的排序我們就快要講完了&#xff0c;那這篇文章我們就講一下非比較排序--計數排序。 一、非比較排序 1.基本思想 計數排序又稱為鴿巢原理&#xff0c;是對哈希直接定址法的變形應用。 操作步驟&#xff1a; 統計相同元素出現次數 根據統計的結果將序列…

昇思25天學習打卡營第14天|基于MindNLP的文本解碼原理

基于MindNLP的文本解碼原理 文本解碼 文本解碼是自然語言處理中的一個關鍵步驟,特別是在任務如機器翻譯、文本摘要、自動回復生成等領域。解碼過程涉及將編碼器(如語言模型、翻譯模型等)的輸出轉換為可讀的文本序列。以下是一些常見的文本解碼方法和原理: 1. 自回歸解碼:…

打造屬于你的私人云盤:在 OrangePi AIpro 上搭建個人云盤

隨著數字化時代的到來&#xff0c;數據的存儲和管理變得愈發重要。相比于公共云存儲服務&#xff0c;搭建一個屬于自己的個人云盤不僅能夠更好地保護隱私&#xff0c;還可以更靈活地管理數據。 近期剛好收到了一個 香橙派 AIpro 的開發板&#xff0c;借此機會用來搭建一個屬于…

美股交易相關知識點 持續完善中

美股交易時間 美東時間&#xff1a;除了凌晨 03:50 ~ 04:00 這10分鐘時間不可交易以外&#xff0c;其他時間都是可以交易的。 如果是在香港或者北京時間下交易要區分兩種: 美東夏令時&#xff1a;除了下午 15:50 ~ 16:00 這10分鐘時間不可交易以外&#xff0c;其他時間都是可…

法國工程師IMT聯盟 密碼學及其應用 2022年期末考試

1 密碼學 1.1 問題1 對稱加密&#xff08;密鑰加密) 1.1.1 問題 對稱密鑰la cryptographie symtrique和公開密鑰有哪些優缺點&#xff1f; 1.1.1.1 對稱加密&#xff08;密鑰加密)的優缺點 1.1.1.1.1 優點 加解密速度快encrypt and decrypt&#xff1a;對稱加密算法通常基于…

【vue組件庫搭建06】組件庫構建及npm發包

一、格式化目錄結構 根據以下圖片搭建組件庫目錄 index.js作為入口文件&#xff0c;將所有組件引入&#xff0c;并注冊組件名稱 import { EButton } from "./Button"; export * from "./Button"; import { ECard } from "./Card"; export * fr…

一、MyBatis

一、MyBatis 1、MyBatis簡介 1.1、MyBatis歷史 MyBatis最初是Apache的一個開源項目iBatis, 2010年6月這個項目由Apache Software Foundation遷移到了Google Code。隨著開發團隊轉投Google Code旗下&#xff0c; iBatis3.x正式更名為MyBatis。代碼于2013年11月遷移到Github。…

計算機網絡之無線局域網

1.無線局域網工作方式 工作方式&#xff1a;每臺PC機上有一個無線收發機&#xff08;無線網卡&#xff09;&#xff0c; 它能夠向網絡上的其他PC機發送和接受無線電信號。 與有線以太網相似&#xff0c;無線局域網也是打包方式發送數據的。每塊網卡都有一個永久的、唯一的ID號…

Unity2D - 基本戰斗系統(Battle System Design)

1. 攻擊邏輯 在Entity中初始化兩個變量&#xff0c;因為在每個角色幾乎都擁有攻擊狀態。這兩個變量分別是transform類&#xff0c;接收一個坐標和一個半徑畫一個圓作為攻擊的判定范圍 public Transform attackCheck; public float attackCheckRadius; 為了可視化攻擊范圍&am…

Python的多態

在 Python 中&#xff0c;多態&#xff08;Polymorphism&#xff09;是指不同的對象可以對相同的消息&#xff08;方法調用&#xff09;做出不同的響應。 簡單來說&#xff0c;多態允許使用一個統一的接口來操作不同類型的對象&#xff0c;而這些對象會根據自身的類型來執行相應…

某水利集團晉升體系優化項目成功案例紀實

——通過多元化職業晉升通道&#xff0c;激發員工潛力 【客戶行業】水務行業&#xff1b;水利處理 【問題類型】晉升體系優化&#xff1b;人才管理系統 【客戶背景】 某水利處理集團是國內領先的綜合性水資源管理與水務服務供應商。該集團專注于提供包括原水供應、自來水生…

基于ROS的智能網聯車遠程交互軟件,全UI無需記憶指令,劍指核心原理。

基于ROS的智能網聯車遠程交互軟件&#xff0c;全UI無需記憶指令&#xff0c;劍指核心原理。 服務于中汽恒泰&#xff0c;偉大的項目&#xff0c;希望看官點贊&#xff0c;謝謝~~ 進程&#xff08;節點&#xff09;列表化&#xff0c;參數面板化&#xff0c;實現快速機器人配置…

Linux--V4L2攝像頭驅動框架及UVC淺析

一、前言 對于一個usb攝像頭&#xff0c;它的內核驅動源碼位于/drivers/media/usb/uvc/ 核心層&#xff1a;V4L2_dev.c文件 硬件相關層&#xff1a; uvc_driver.c文件 本篇記錄基于對6.8.8.8內核下vivid-core.c文件&#xff08;虛擬視頻驅動程序&#xff09;的分析&#xff…

推薦系統中Prior Belief的概念(附代碼)

在推薦系統中&#xff0c;先驗信念&#xff08;prior belief&#xff09;是指在沒有觀察到實際數據之前&#xff0c;我們對某些參數或變量的初始假設或預期。這種先驗信念可以幫助模型在數據稀疏或噪聲較多的情況下做出更好的預測。 先驗信念&#xff08;Prior Belief&#xf…

獨立站運營招聘:尋找璀璨之星,開啟運營之旅

尊敬的各位同仁&#xff0c;我乃大家熟知的獨立站長&#xff0c;對于運營獨立站點始終保持著滿腔熱情。今日&#xff0c;我欲與諸位共同探討一熱門議題—獨立站運營招聘。此次招聘不再僅為職位爭奪&#xff0c;更為尋找璀璨之星的探險之旅。 獨立站的靈魂&#xff1a;什么是獨…

Mysql中視圖的使用以及常見運算符的使用示例和優先級

場景 基礎知識回顧&#xff1a;mysql中視圖的基礎使用以及常見運算符的使用示例。 注&#xff1a; 博客&#xff1a;霸道流氓氣質-CSDN博客 實現 Mysql中視圖的使用 視圖的創建 CREATE VIEW stu_view AS SELECT * FROM bus_student; 視圖查詢 SELECT * FROM stu_view;…