最強大腦
時間限制: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到開闢的數字中 ...