牛客網第六天的訓練
阿新 • • 發佈:2018-11-24
基礎題:陣列中重複的數字
題目描述:在一個長度為n的數組裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意一個重複的數字。 例如,如果輸入長度為7的陣列{2,3,1,0,2,5,3},那麼對應的輸出是第一個重複的數字2。
因為範圍是0到n-1,所以我們可以再開一個數組用來標記,初始化為1,如果出現過則置為-1,如果再次訪問發現是-1,說明已經重複了,然後就好了。
class Solution { public: // Parameters: // numbers: an array of integers // length: the length of array numbers // duplication: (Output) the duplicated number in the array number // Return value: true if the input is valid, and there are some duplications in the array number // otherwise false bool duplicate(int numbers[], int length, int* duplication) { int a[1<<11]={1}; for(int i=0;i<length;++i) //遍歷這個字串 { if(a[numbers[i]]==-1) //如果發現為-1,說明已經出現過了 { *duplication=numbers[i]; return true; break; } a[numbers[i]]=-1; //把他標記一下 } return false; } };
進階題: NowCoder的遭遇
題目描述:NowCoder的老家住在工業區,日耗電量非常大。是政府的眼中釘肉中刺,但又沒辦法,這裡頭住的可都是納稅大戶呀。
今年7月,又傳來了不幸的訊息,政府要在7、8月對該區進行拉閘限電。但迫於壓力,限電制度規則不會太摳門,政府決定從7月1日停電,然後隔一天到7月3日再停電,再隔兩天到7月6日停電,一次下去,每次都比上一次晚一天。
NowCoder可是軟體專業的學生,怎麼離得開計算機。如果停電,就“英雄無用武之地”了。呵呵。
所以他開始盤算起自己回家的日子了,他想知道自己到家後到底要經歷多少天倒黴的停電。你能幫他算一算嗎?
題目給的資料都再7、8月之間,所以只考慮7、8月的情況就好了。
#include<iostream> #include<algorithm> #include<cstring> using namespace std; void print_table(); int num[63]; //7、8月一共62天,放再一個數字裡 int main() { print_table(); //然後把停電的日子標記起來 int a,b,day,ans; //day代表回家的那一天 while(~scanf("%d/%d",&a,&b)) { if(!a&&!b) break; ans=0,day=0; if(a==8) day+=31; //如果是8月,直接加31天 day+=b; //然後再把日期加上,就是回家的日子 for(int i=day;i<63;++i) //從回家的這一天開始到最後一天開始遍歷 { if(num[i]) ans++; } cout<<ans<<endl; } return 0; } void print_table() //給7、8月停電的日子打表 { memset(num,0,sizeof(num)); int m=0,k=1; //m為第幾天,k為每次中間增加的天數 while(m<63) { m+=k; num[m]=1; k++; } }