1. 程式人生 > >牛客網第六天的訓練

牛客網第六天的訓練

基礎題:陣列中重複的數字

題目描述:在一個長度為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++;
	}	
}