C語言面試題(拓展)

1、字符串中獲取最長無重復字符子串。

要在字符串中找到最長的無重復字符的子串,可以使用滑動窗口技術。滑動窗口通過兩個指針來表示當前窗口的起始和結束位置,并且維護一個哈希表來記錄字符及其最后出現的位置,以此來確保字符不重復。

以下是用C語言實現的代碼:

#include <stdio.h>
#include <string.h>
?
#define MAX_CHARS 256
?
int longestUniqueSubsttr(char *str) {int n = strlen(str);int current_len = 1; ?// 當前子串的長度int max_len = 1; ? ? ?// 結果int prev_index; ? ? ? //前一個索引
?int *visited = (int *)malloc(sizeof(int) * MAX_CHARS);
?for (int i = 0; i < MAX_CHARS; i++) {visited[i] = -1;}
?visited[(int)str[0]] = 0;
?for (int i = 1; i < n; i++) {prev_index = visited[(int)str[i]];
?if (prev_index == -1 || i - current_len > prev_index) {current_len++;} else {if (current_len > max_len) {max_len = current_len;}current_len = i - prev_index;}
?visited[(int)str[i]] = i;}
?if (current_len > max_len) {max_len = current_len;}
?free(visited);
?return max_len;
}
?
int main() {char str[] = "abcabcbb";printf("最長無重復字符子串的長度是 %d\n", longestUniqueSubsttr(str));return 0;
}

解釋:

  1. 初始化

    • visited 數組用于存儲每個字符的最后出現位置,大小為 MAX_CHARS(ASCII 字符集)。

    • 初始化 visited 數組為 -1,表示所有字符初始時都未出現過。

  2. 遍歷字符串

    • 對于每個字符,檢查它是否在當前窗口內已出現。

    • 使用 prev_index 保存字符上次出現的位置。

    • 如果字符未出現或者不在當前窗口內,當前窗口長度 current_len 加 1。

    • 如果字符在當前窗口內已出現,更新最大長度 max_len,并重置 current_len 為當前窗口的新長度。

  3. 更新哈希表

    • 更新當前字符在 visited 中的位置。

  4. 返回結果

    • 返回最長無重復字符子串的長度。

這個算法的時間復雜度是 O(n),因為每個字符在最壞情況下也只會被訪問兩次(一次被加入窗口,一次被移出窗口),空間復雜度是 O(1),因為 visited 數組的大小是固定的。

2、求給定數組中出現頻率最高的前n個數。

為了找到給定數組中出現頻率最高的前n個數,我們需要以下步驟:

  1. 統計每個元素的出現次數:使用一個哈希表(可以用C語言中的結構體數組來實現)。

  2. 將元素及其出現次數存儲在一個結構體數組中

  3. 對結構體數組按出現次數進行排序

  4. 輸出前n個頻率最高的元素

下面是完整的C語言實現代碼:

#include <stdio.h>
#include <stdlib.h>
?
typedef struct {int value;int count;
} ElementCount;
?
int compare(const void *a, const void *b) {ElementCount *elemA = (ElementCount *)a;ElementCount *elemB = (ElementCount *)b;return elemB->count - elemA->count;
}
?
void findTopNFrequent(int arr[], int size, int n) {ElementCount *elementCounts = malloc(size * sizeof(ElementCount));int distinctElements = 0;
?// 初始化元素計數器for (int i = 0; i < size; i++) {elementCounts[i].value = 0;elementCounts[i].count = 0;}
?// 統計每個元素的出現次數for (int i = 0; i < size; i++) {int found = 0;for (int j = 0; j < distinctElements; j++) {if (elementCounts[j].value == arr[i]) {elementCounts[j].count++;found = 1;break;}}if (!found) {elementCounts[distinctElements].value = arr[i];elementCounts[distinctElements].count = 1;distinctElements++;}}
?//按照出現次數降序排序元素qsort(elementCounts, distinctElements, sizeof(ElementCount), compare);
?// 打印前n個元素for (int i = 0; i < n && i < distinctElements; i++) {printf("Element: %d, Count: %d\n", elementCounts[i].value, elementCounts[i].count);}
?free(elementCounts);
}
?
int main() {int arr[] = {1, 3, 1, 3, 2, 1, 4, 5, 2, 3, 3, 4, 5, 4, 4, 4, 5};int size = sizeof(arr) / sizeof(arr[0]);int n = 3;
?findTopNFrequent(arr, size, n);
?return 0;
}

解釋:

  1. 定義結構體 ElementCount

    • value 存儲數組元素的值。

    • count 存儲該元素的出現次數。

  2. 統計每個元素的出現次數

    • 遍歷數組 arr,如果 elementCounts 中已存在該元素,則增加其 count

    • 如果不存在,則將該元素及其 count 初始化為1,并記錄到 elementCounts 中。

  3. 排序

    • 使用 qsortelementCounts 數組按 count 從大到小排序。

  4. 輸出前n個頻率最高的元素

    • 遍歷排序后的 elementCounts,輸出前n個元素。

  5. 釋放內存

    • 釋放動態分配的內存 elementCounts

通過這種方法,我們可以有效地找到數組中出現頻率最高的前n個數。

3、100只駱駝,100筐土豆,大駱駝背3筐,中駱駝背2筐,2只小駱駝背1筐,問有多少種組合,思路?

要解決這個問題,我們需要計算所有可能的組合方式,使得100只駱駝總共能運送100筐土豆。我們可以通過設立不同的變量表示不同類型駱駝的數量,然后利用這些變量設立方程來解決問題。具體思路如下:

變量定義

  • ( x ) 表示大駱駝的數量(每只大駱駝可以背3筐土豆)。

  • ( y ) 表示中駱駝的數量(每只中駱駝可以背2筐土豆)。

  • ( z ) 表示小駱駝的數量(每2只小駱駝可以背1筐土豆,所以一只小駱駝相當于0.5筐)。

設立方程

我們有以下兩個約束條件:

  1. 駱駝總數為100只: [ x + y + z = 100 ]

  2. 背的土豆總數為100筐: [ 3x + 2y + 0.5z = 100 ]

解方程

從第一個方程我們可以得到: [ z = 100 - x - y ]

將 ( z ) 代入第二個方程: [ 3x + 2y + 0.5(100 - x - y) = 100 ]

解簡化這個方程: [ 3x + 2y + 50 - 0.5x - 0.5y = 100 ] [ 2.5x + 1.5y = 50 ] [ 5x + 3y = 100 ]

現在我們只需要解這個方程就能得到所有的可能組合。具體步驟如下:

  1. 逐一嘗試 ( x ) 的值從0到100之間的所有整數,判斷是否有對應的 ( y ) 和 ( z ) 滿足方程。

  2. 確保 ( x, y, z ) 都是非負整數。

實現代碼

我們可以使用簡單的C語言代碼來計算所有滿足條件的組合。

#include <stdio.h>
?
int main() {int x, y, z;int count = 0;
?for (x = 0; x <= 100; x++) {for (y = 0; y <= 100; y++) {z = 100 - x - y;if (z >= 0 && (5 * x + 3 * y == 100)) {printf("大駱駝: %d, 中駱駝: %d, 小駱駝: %d\n", x, y, z);count++;}}}
?printf("組合的總數: %d\n", count);
?return 0;
}

解釋代碼

  1. 雙重循環:外部循環遍歷大駱駝的數量 ( x ),內部循環遍歷中駱駝的數量 ( y )。

  2. 計算小駱駝的數量 ( z ):根據 ( z = 100 - x - y ) 計算。

  3. 判斷條件:檢查 ( z ) 是否為非負整數,并且檢查方程 ( 5x + 3y = 100 ) 是否成立。

  4. 輸出結果:如果條件滿足,輸出對應的 ( x, y, z ) 的值并計數。

這段代碼會輸出所有可能的駱駝組合,并且打印出組合的總數。

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

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

相關文章

【云嵐家政】-day00-開發環境配置

文章目錄 1 開發工具版本2 IDEA環境配置2.1 編碼配置2.2 自動導包設置2.3 提示忽略大小寫2.4 設置 Java 編譯級別 3 Maven環境3.1 安裝Maven3.2 配置倉庫3.3 IDEA中配置maven 4 配置虛擬機4.1 導入虛擬機4.2 問題 5 配置數據庫環境5.1 啟動mysql容器5.2 使用MySQL客戶端連接數據…

Java Socket 網絡編程實例(阻塞IO、非阻塞IO、多路復用Selector、AIO)

文章目錄 1. 概述2. TCP 阻塞式IO 網絡編程實例2.1 TCP網絡編程服務端2.2 ByteBufferUtil2.3 客戶端代碼2.4 運行截圖 3. TCP 非阻塞式IO 網絡編程實例3.1 服務端3.2 客戶端3.3 運行截圖 4. 多路復用4.1 服務器端4.2 客戶端4.3 運行截圖 5. AIO5.1 AIO 服務端5.2 客戶端5.3 運行…

C++筆試強訓day39

目錄 1.神奇的字母&#xff08;二&#xff09; 2.字符編碼 3.最少的完全平方數 1.神奇的字母&#xff08;二&#xff09; 鏈接https://ac.nowcoder.com/acm/problem/205832 看輸出描述即可知輸出次數最多的那個字母即可。 哈希表直接秒了&#xff1a; #include <iostre…

一維時間序列突變檢測方法(小波等,MATLAB R2021B)

信號的突變點檢測問題是指在生產實踐中&#xff0c;反映各種系統工作狀態的信號&#xff0c;可能因為受到不同類型的噪聲或外界干擾而發生了信號突變&#xff0c;導致嚴重失真的信號出現&#xff0c;因此必須探測突變出現的起點和終點。研究目的在于設計出檢測方案&#xff0c;…

CPU內部結構窺探·「2」

從一條匯編加法指令出發&#xff0c;分析cpu內部發生了什么&#xff1f; 本文將詳細剖析ARMv8架構中加法指令的執行過程&#xff0c;深入理解其在CPU上的運行機制。 ARMv8匯編基礎 在ARMv8匯編語言中&#xff0c;加法指令ADD的基本格式如下&#xff1a; ADD destination, s…

【python】python租房數據分析可視化(源碼+數據+報告)【獨一無二】

&#x1f449;博__主&#x1f448;&#xff1a;米碼收割機 &#x1f449;技__能&#x1f448;&#xff1a;C/Python語言 &#x1f449;公眾號&#x1f448;&#xff1a;測試開發自動化【獲取源碼商業合作】 &#x1f449;榮__譽&#x1f448;&#xff1a;阿里云博客專家博主、5…

在Go語言中如何使用變量

1. 變量 Go 中的變量是標識符。例如&#xff0c;我們可能需要存儲客戶的電子郵件地址&#xff0c;但還需要確保它是有效的。這種情況下&#xff0c;可以創建一個名為 email 的變量來存儲電子郵件的值。電子郵件地址可以分配給 email 變量。 變量引用一個內存地址&#xff0c;賦…

OpenCV學習(4.3) 圖像閾值

1.目的 在本教程中&#xff1a; 你會學到簡單閾值法&#xff0c;自適應閾值法&#xff0c;以及 Otsu 閾值法(俗稱大津法)等。你會學到如下函數&#xff1a;**cv.threshold&#xff0c;cv.adaptiveThreshold** 等。 2.簡單閾值法 此方法是直截了當的。如果像素值大于閾值&am…

word2016版本中同時顯示多個頁面

為了方便查看word內容&#xff0c;我們會將多個頁面同時顯示。 對于2016版&#xff0c;操作方法如下&#xff1a; 視圖 ---》多頁

Jan任意文件讀取/下載和上傳漏洞

自從ChatGPT橫空出世以來&#xff0c;我一直想找一個可以自己訓練的AI大模型&#xff0c;然而在使用Jan的過程中&#xff0c;數據包中傳遞的參數引起了我的興趣&#xff0c;簡單嘗試后發現了任意文件讀取和任意文件上傳漏洞。 簡介 Jan是ChatGPT的開源替代品&#xff0c;它在…

vuInhub靶場實戰系列--bulldog-1

免責聲明 本文檔僅供學習和研究使用,請勿使用文中的技術源碼用于非法用途,任何人造成的任何負面影響,與本人無關。 目錄 免責聲明前言一、環境配置1.1 靶場信息1.2 靶場配置 二、信息收集2.1 主機發現2.1.1 netdiscover2.1.2 nmap主機掃描2.1.3 arp-scan主機掃描 2.2 端口掃描…

友思特案例 | 自動快速定位:使用波長選擇器測量濾光片的關鍵光學性能指標

導讀 光學濾光片檢測的手動調節校準的傳統方法存在諸多不確定誤差和高昂的成本消耗。友思特全自動可調諧光源檢測解決方案&#xff0c;可全自動調節波長帶寬&#xff0c;快速收集光譜數據&#xff0c;縮短檢測時間、降低質檢成本&#xff0c;實現極高的準確率和快速檢測效率。…

RA8D1-Vision Board上OSPI-Flash實踐

Vision-Board 開發板是 RT-Thread 推出基于瑞薩 Cortex-M85 架構 RA8D1 芯片,擁有Helium和TrustZone技術的加持,性能非常強大。 內核:480 MHz Arm Cortex-M85,包含Helium和TrustZone技術 存儲:集成2MB/1MB閃存和1MB SRAM(包括TCM,512KB ECC保護) 外設:兼容xSPI的四線O…

gorse修改開源項目后,如何使用Docker compose發布

代碼修改 git checkout v0.4.15 修改代碼后提交。 鏡像構建 export GOOSlinux export GOARCHamd64 export GOMAXPROCS8go build -ldflags"-s -w -X github.com/zhenghaoz/gorse/cmd/version.Version$(git describe --tags $(git rev-parse HEAD)) -X github.com/zhengh…

如何在強數據一致性要求下設計數據庫的高可用架構

在高可用的三大架構設計(基于數據層的高可用、基于業務層的高可用,以及融合的高可用架構設計)中。僅僅解決了業務連續性的問題:也就是當服務器因為各種原因,發生宕機,導致MySQL 數據庫不可用之后,快速恢復業務。但對有狀態的數據庫服務來說,在一些核心業務系統中,比如…

運營商卷大模型,云廠商霸主地位不保?

文&#xff5c;藝 思 編&#xff5c;王一粟 經過了2023年的小試牛刀&#xff0c;2024年&#xff0c;三大運營商帶著大模型一路狂飆。 剛剛過去的5月&#xff0c;中國電信、中國移動、中國聯通三大運營商集體完成了新一輪的大模型進化&#xff0c;特別是圍繞大模型的研發與…

【區分vue2和vue3下的element UI TimePicker 時間選擇器組件,分別詳細介紹屬性,事件,方法如何使用,并舉例】

在 Vue 2 中&#xff0c;我們通常使用 Element UI 來實現時間選擇器&#xff08;TimePicker&#xff09;組件。然而&#xff0c;在 Vue 3 中&#xff0c;Element UI 沒有官方支持 Vue 3 的版本。但是&#xff0c;有一個名為 Element Plus 的庫&#xff0c;它是 Element UI 的 V…

04--Tomcat

前言&#xff1a;本章整理tomcat的知識點&#xff0c;tomcat知識點相較nginx比較少&#xff0c;但是也是運維必會的軟件&#xff0c;這里結合實際項目整理一下。 1、tomcat簡介 Tomcat 服務器是一個免費的開放源代碼的Web 應用服務器&#xff0c;屬于輕量級應用服務器&#x…

強烈安利10款手機App!

AI視頻生成&#xff1a;小說文案智能分鏡智能識別角色和場景批量Ai繪圖自動配音添加音樂一鍵合成視頻https://aitools.jurilu.com/ 1.聽書神器——昊昊聽書 昊昊聽書app是一款專門為用戶提供有聲讀物的應用程序。它不僅提供了各種類型的有聲書籍&#xff0c;還有各種知名的電…

pw命令1

1、查看集群狀態命令 gs_om -t status --detail 2、備節點升主&#xff08;本例子升2節點為主&#xff09; date && time cm_ctl switchover -n 2 -D /database/panweidb/data 3、cm_ctl是全局的&#xff0c;在一個節點運行 cm_ctl stop && cm_ctl start 就重…