[C] [字节跳动] [编程题] 手串
時間限制:C/C++ 1秒,其他語言2秒空間限制:C/C++ 64M,其他語言128M
鏈接:https://www.nowcoder.com/questionTerminal/0bb1fad52f474bdaa4d7636ca3a98244
來源:牛客網
首先遇到這一題是在字節跳動的一個前端試卷里,看上去不難,似乎就是一個數組+簡單查找的問題。但是我一直報錯,測試樣例過了,提交代碼就一直0分。
氣死了,遂上CSDN查找題解,作為一個底層C選手,讓我找到了一篇C++的題解,看懂之后,這不跟我的思路一樣嗎?這位博主提供了一個C++的AC代碼,但我發現缺少環的判斷啊,但是——當我把他的代碼CTRL C+V到答題區域之后,測試樣例沒過,提交卻AC了?
最后發現是題錯了!題目要求注意這里手串是一個環形,字節你是把它吃了嗎?去掉環的判斷就能AC了,然而連測試樣例都過不了你是認真的嗎?
練習結束之后我不甘心,上牛客網搜這道題,搜出一毛一樣的題之后提交了我的帶環判斷的代碼,順利AC,再找到那位博主的代碼CTRL C+V,就0分。
我還是不甘心,遂把卷子翻出來重做,刪掉我最后的環形判斷的代碼,嘿,AC了。
我寶貴的一個半小時就浪費在一個錯題上!!看到這篇博客的小伙伴們別再踩坑了,嗚嗚嗚。
題目描述
作為一個手串藝人,有金主向你訂購了一條包含n個雜色串珠的手串——每個串珠要么無色,要么涂了若干種顏色。為了使手串的色彩看起來不那么單調,金主要求,手串上的任意一種顏色(不包含無色),在任意連續的m個串珠里至多出現一次(注意這里手串是一個環形)。手串上的顏色一共有c種。現在按順時針序告訴你n個串珠的手串上,每個串珠用所包含的顏色分別有哪些。請你判斷該手串上有多少種顏色不符合要求。即詢問有多少種顏色在任意連續m個串珠中出現了至少兩次。
輸入描述:
第一行輸入n,m,c三個數,用空格隔開。(1 <= n <= 10000, 1 <= m <= 1000, 1 <= c <= 50) 接下來n行每行的第一個數num_i(0 <= num_i <= c)表示第i顆珠子有多少種顏色。接下來依次讀入num_i個數字,每個數字x表示第i顆柱子上包含第x種顏色(1 <= x <= c)
輸出描述:
一個非負整數,表示該手鏈上有多少種顏色不符需求。
示例1
輸入
5 2 3
3 1 2 3
0
2 2 3
1 2
1 3
輸出
2
說明
第一種顏色出現在第1顆串珠,與規則無沖突。
第二種顏色分別出現在第 1,3,4顆串珠,第3顆與第4顆串珠相鄰,所以不合要求。
第三種顏色分別出現在第1,3,5顆串珠,第5顆串珠的下一個是第1顆,所以不合要求。
總計有2種顏色的分布是有問題的。
這里第2顆串珠是透明的。
解題思路
觀察數字,n比較大,c比較小,可以定義一個
a[n][c]的數組,表示第c號顏色是否存在于第n顆珠子上。存在則為1,不存在則為0。
當然,如果你喜歡,可以定義為a[c][n],含義一樣。
接著就是一個用一個數組來存對于每個顏色的珠子的位置,我的代碼里是b[]。
接下來就是條件判斷:b[i + 1] - b[i] < m表示它在m顆內有重復出現,我們提前定義一個flag,表示這個顏色是否違規。(環判斷要用上)
違規一經發現,就要被抓走(break)
環判斷:對于最后出現位置b[k](k是b的長度),判斷它離尾部的距離是否小于m,如果小于m,看b[1]出現的位置。
如果b[k] + m > n && b[1] < m - (n - b[k]) && flag == 0則表示在首位出游違規現象發生,抓走!
題解
#include <stdio.h>
int b[100001];
int a[100001][51];
int main()
{int n, m, c, num, color, cnt = 0;int i, j, k, l;scanf("%d %d %d", &n, &m, &c);for (i = 0; i < n; i++){scanf("%d", &num);for (j = 0; j < num; j++){scanf("%d", &color);a[i][color] = 1;}}int flag;for (j = 1; j <= c; j++){k = 0;flag = 0;for (i = 0; i < n; i++){if (a[i][j] == 1){k++;b[k] = i + 1;}}if (k != 1){for (i = 1; i < k; i++){if ( b[i + 1] - b[i] < m){cnt++;flag = 1;break;}}/* */if (b[k] + m > n && b[1] < m - (n - b[k]) && flag == 0){cnt++;}}}printf("%d", cnt);return 0;
}
友好起見,在此還是附上前文提到的那位C++的AC選手,注意只在字節(今日頭條)筆試題里有效。
當然我不是鼓勵讀者去復制代碼!
鏈接:今日頭條筆試之手串問題
總結
以上是生活随笔為你收集整理的[C] [字节跳动] [编程题] 手串的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个好听的美容院名字
- 下一篇: [C] [二分] C语言实现快速排序