奇虎360 2017校招筆試題

2022-08-24 22:48:11 字數 4580 閱讀 5404

最強大腦

時間限制:c/c++語言 1000ms;其他語言 3000ms

記憶體限制:c/c++語言 65536kb;其他語言 589824kb

題目描述:

小b乘火車和朋友們一起在n市到m市之間旅行。她在路途中時睡時醒。當她醒來**窗外的風景時,注意到每個火車站都有一種特別顏色的旗幟,但是她看到的旗

幟僅僅是經過的一小部分。小b在乘車過程中有兩次清醒的時間,她到達旅程終點時處於睡夢中。出站時,她和朋友們談論著一路的見聞,朋友們覺得很有意思。

他們把n到和m之間經過車站的旗幟顏色依次列出來,然後告訴你小b記得的旗幟顏色序列,讓你判斷小b究竟是從n和m之間哪些方向才能看到所說顏色的旗幟,還是根本就不可能看到?顏色用字母代表,相同的字母代表相同的顏色,不同的字母則表示不同的顏色。

輸入 輸入中有多組測試資料。每組測試資料報含三行,第一行為乙個由小寫拉丁字母構成的非空字串,長度不超過10^5,表示n到m之間車站的顏色。火車從m向

n執行時,經過的車站相同,只是方向相反。第二行為小b在第一次睡醒時看到的顏色序列,第三行為小b在第二次睡醒時看到的顏色序列。兩個序列都是小寫的拉

丁字母構成的字串,長度不超過100個字母。每個序列的顏色順序排列按小b看到的時間順序排列。

輸出 對每組測試資料,在單獨的行中輸出小b的旅行方向。

forward – 由n到m方向;

backward – 由m到n方向;

both – 兩種方向都有可能;

invalid – 不可能看到這樣的顏色序列;

樣例輸入

atob

a b

aaacaaa

aca

aa 樣例輸出

forward

both

hint

火車假定時刻處於運動狀態,不會兩次看到同乙個旗幟。n市和m市的車站沒有旗幟。

當時的**:

#include 

#include

#include

using

namespace

std;

string reverse(string

s1)

return

s1;}

bool issubseq(string s1,string

s2) }

if(i!=s1.length()-1 && j==s2.length())

return

false

; }

if(i==s1.length()&&s2[j-1]==s1[i-1

])

return

true

;

else

return

false;}

intmain()

return0;

}

上面的**只a了70%,現在才發現題目理解錯了,忽略了每次醒來看到的旗幟應該是連續的,應該是判斷是否是子串的問題,而我理解成了判斷子串行。另外string有現成的reverse函式,不需要自己實現。。。修正後的**:

#include #include

#include

using

namespace

std;

intmain()

if(cols2.find(see1)!=cols2.npos)

if(forw&&backw)

cout

<<"

both

"

if(forw)

cout

<<"

forward

"

if(backw)

cout

<<"

backward

"

cout

<<"

invalid

"<}

return0;

}

記憶體管理

時間限制:c/c++語言 1000ms;其他語言 3000ms

記憶體限制:c/c++語言 65536kb;其他語言 589824kb

題目描述:

物聯網技術的蓬勃發展,各種感測器紛紛出現。小b所在的專案組正在開發乙個物聯網專案,她們在研究設計一種新的感測器。這種感測器有自己的基本處理單元,

具有一定的自主性,能夠進行簡單的資料收集、處理、儲存和傳輸。為降低系統功耗並保證系統可靠性和可控性,他們要對記憶體進行基本的管理。研究小組計畫開發

new size:分配size位元組大小的記憶體塊,返回該記憶體塊的控制代碼handle,size為正整數;

del handle:釋放控制代碼handle指向的記憶體塊;

初始記憶體為 initsize 位元組大小的整片空閒記憶體,編號為 1 到 initsize 。

new size操作中,若存在不小於size的連續空閒記憶體,則按照小位址優先的原則從空閒記憶體區域中分配size大小的記憶體塊,標記該記憶體塊狀態為已分配,並返回指向該記憶體塊的控制代碼。若無法分配,則返回空(null)。

del handle操作釋放由handle標記的記憶體塊,標記被釋放的記憶體狀態為空閒。若handle為無效控制代碼,則返回illegal_operation。

def 完成記憶體整理工作,無返回值。

根據設計,每次成功記憶體分配返回的控制代碼為乙個正整數,從1開始,依次計數。失敗的儲存分配操作不影響計數。

專案小組將此項任務分配給小b,小b向你求助,你能幫她嗎?

輸入 輸入中有多組測試資料。每組測試資料的第一行為兩個正整數t和maxmem(1<=t<=10000, 1<=maxmem<=10000),其中t為操作次數,maxmem為初始記憶體大小,隨後有t行操作指令。

輸出 對每組測試資料,按操作順序輸出操作結果。對每個new操作,在單獨行中輸出結果,成功時輸出其返回控制代碼值,失敗則輸出null。若del操作失敗,輸出illegal_operation。def不產生輸出。

樣例輸入

6 10

new 5

new 3

del 1

new 6

def

new 6

樣例輸出

1 2

null

3當時考慮用map來儲存記憶體結構,因為它可以自動排序,key中儲存記憶體塊的開始位置,value儲存結束位置,維護兩個map,乙個表示空的記憶體塊,乙個表示已分配記憶體塊。但由於map的迭代器返回型別的問題,出現了編譯錯誤,同時存在handle無法儲存的問題。現在考慮使用鍊錶list儲存。上面的例子可以正確通過,但是其他就不知道了。

#include #include 

#include

#include

using

namespace

std;

struct

memnode

};list

empty;//空的記憶體塊鍊錶

list

used; //已分配記憶體鍊錶

intmaxmem;

int handle=0

;int mynew(int maxsize,int

size)

else

if(i->end-i->start+1==size)//若該空閒塊等於所需記憶體,將該塊加入used,從empty中刪去該塊

}

return

false

; //找不到合適的空閒塊則分配失敗

}bool del(int

handle)//釋放記憶體塊

if(i->end+1==ie->start)

//找到第乙個起始位址大於該釋放記憶體塊的終止位址的空閒塊,將該塊插入到其前面。

if(i->end+1

start)

}//若不符合上面情況,直接在empty末尾插入

memnode m;

m.start=i->start;

m.end=i->end;

m.hand=0

; empty.push_back(m);

used.erase(i);

return

true

; }

}return

res;

}void

def()

//empty中所有空閒塊合併,所以將其清空,插入count到最大記憶體位址的位址塊

empty.clear();

memnode m;

m.start=count;

m.end=maxmem;

m.hand=0

; empty.push_back(m);

}int

main()

else

if(order.compare("

del")==0

)

else

if(order.compare("

def")==0

) def();

}

return0;

}

奇虎360 2017春招真題

1.分金子 a b兩夥馬賊意外地在一片沙漠中發現了一處金礦,雙方都想獨佔金礦,但各自的實力都不足以吞下對方,經過談判後,雙方同意用乙個公平的方式來處理這片金礦。處理的規則如下 他們把整個金礦分成n段,由a b開始輪流從最左端或最右端佔據一段,直到分完為止。馬賊a想提前知道他們能分到多少金子,因此請你...

最強大腦 奇虎360 2017校園招聘筆試題

題目 最強大腦 時間限制 c c 語言 1000ms 其他語言 3000ms 記憶體限制 c c 語言 65536kb 其他語言 589824kb 題目描述 小b乘火車和朋友們一起在n市到m市之間旅行。她在路途中時睡時醒。當她醒來 窗外的風景時,注意到每個火車站都有一種特別顏色的旗幟,但是她看到的旗...

2017校招筆試題

題目 輸入乙個字串從左到右遍歷,如果遇到三個連續相同的子串就將這個子串刪除,並將原串剩下的部分拼接到一起,重複上述過程,直到字串中沒有可以刪除的子串。eg 輸入 aaabccdddcb aabbbabbba 輸出 bb a重要 從乙個字串中刪除乙個子串,必須將原字串的內容strcpy到開闢的數字中 ...