C/C++校招笔试面接经典题目まとめ8
4743 ワード
タイトル72:以下のプログラムの時間複雑度は(そのうちm>1,e>0)()
A:log m B:mの平方C:mの1/2方D:mの1/3方
解析:
1.x=(x+y)/2=(m+1)/2 mは非常に大きく、x=m/2である.
y=m/x、x=m/2ならy=2;
2.x=(x+y)/2=(m/2+2)/2=m/4+1 mが非常に大きい場合、x=m/4;
y=m/x、x=m/4ならy=4;
3.x=(x+y)/2=(m/4+4)/2=m/8+2 mは非常に大きく、x=m/8である.
y=m/x、x=m/8ならy=8;
.........
x=m/2n,y=2n
x-y=m/2 n-2 n=0のときm/2 n-2 n=0 m=22 n=>n=(logm)/2
タイトル73:fun(484)の戻り値を求める()
True
B:False
この问题は间违っていて、単纯に毎回2をプラスすると思って、最后にプラスして奇数です.実は程勲の運行過程はこうです.
loop 1:sum=1, i=3 loop 2:sum=4, i=5 loop 3:sum=9, i=7 loop 4:sum=16,i=9 loop 5:sum=25,i=11 loop 6:sum=36,i=13 loop 7:sum=49,i=15
... 法則によりsumの値はサイクル回数の二乗,22*22=484,サイクル終了時sum=484,関数はtrueを返すことが分かった.
題目74:以下の関数のf(1)の値は()
C:7 D:8
解析:この問題は主にstaticを調べ、このキーワードを持ってから変数は一度だけ初期化されます.この関数は再帰呼び出しです.f(1):n=2;i=2;呼び出しf(2)f(2):n=4;i=3;呼び出しf(4)f(4):n=7;i=4;呼び出しf(7)f(7):戻り7、すなわち最終関数戻り結果7
タイトル75:指定された文字列(ASCIIコード0-255)配列は、余分なスペースを開かずに開始と終了のスペースを削除し、中間の複数の連続するスペースを1つにまとめてください.例えば、「i am a little boy.「i am a little boy」となり、言語は限定されませんが、偽のコードで答えないでください.関数の入出力は以下の関数のプロトタイプを参照してください.
解析:
タイトル76:2つのツリーと、その中の2つのnode(アドレスは空ではありません)が与えられ、この2つのnodeの共通の親ノードが与えられ、この親ノードと2つのノードのパスの和が最小になるように要求されます.あなたのプログラムの最悪の時間の複雑さを説明して、そして具体的な関数を実現して、関数の入出力は以下の関数の原型を参照してください:C++関数の原型:
解析:この問題では木のノードに親ノードへのポインタがあるので,比較的やりやすい.コードは次のとおりです.
ツリー構造の中に親ノードへのポインタがないと仮定すると、この問題はどうすればいいのでしょうか.剣指offerの上にはこのような状況に関する議論があり、下には他山の石がある.まず2つのノードへの経路を取得し、それから経路の中で最後の共通点を探すことに転化し、この共通点は2つのノードの最低の共通祖先である.
今日はこれで、まだ終わっていません.
x = m;
y = 1;
while (x - y > e)
{
x = (x + y) / 2;
y = m / x;
}
print(x);
A:log m B:mの平方C:mの1/2方D:mの1/3方
解析:
1.x=(x+y)/2=(m+1)/2 mは非常に大きく、x=m/2である.
y=m/x、x=m/2ならy=2;
2.x=(x+y)/2=(m/2+2)/2=m/4+1 mが非常に大きい場合、x=m/4;
y=m/x、x=m/4ならy=4;
3.x=(x+y)/2=(m/4+4)/2=m/8+2 mは非常に大きく、x=m/8である.
y=m/x、x=m/8ならy=8;
.........
x=m/2n,y=2n
x-y=m/2 n-2 n=0のときm/2 n-2 n=0 m=22 n=>n=(logm)/2
タイトル73:fun(484)の戻り値を求める()
bool fun(int n){
int sum=0;
for(int i=1;n>sum;i=i+2)
sum=sum+i;
return (n==sum);
}
A: True
B:False
この问题は间违っていて、単纯に毎回2をプラスすると思って、最后にプラスして奇数です.実は程勲の運行過程はこうです.
loop 1:sum=1, i=3 loop 2:sum=4, i=5 loop 3:sum=9, i=7 loop 4:sum=16,i=9 loop 5:sum=25,i=11 loop 6:sum=36,i=13 loop 7:sum=49,i=15
... 法則によりsumの値はサイクル回数の二乗,22*22=484,サイクル終了時sum=484,関数はtrueを返すことが分かった.
題目74:以下の関数のf(1)の値は()
int f(int n){
static int i=1;
if(n>=5)
return n;
n=n+i;
i++;
return f(n);
}
A:5 B:6 C:7 D:8
解析:この問題は主にstaticを調べ、このキーワードを持ってから変数は一度だけ初期化されます.この関数は再帰呼び出しです.f(1):n=2;i=2;呼び出しf(2)f(2):n=4;i=3;呼び出しf(4)f(4):n=7;i=4;呼び出しf(7)f(7):戻り7、すなわち最終関数戻り結果7
タイトル75:指定された文字列(ASCIIコード0-255)配列は、余分なスペースを開かずに開始と終了のスペースを削除し、中間の複数の連続するスペースを1つにまとめてください.例えば、「i am a little boy.「i am a little boy」となり、言語は限定されませんが、偽のコードで答えないでください.関数の入出力は以下の関数のプロトタイプを参照してください.
C++ :
void FormatString(char str[],int len){ }
解析:
void FormatString(char str[],int len)
{
assert(str!=NULL);
int i=0,j=0,k=0;
while(str[i]==' ')i++;//i
while(str[i]!='\0')
{
if(str[i]==' '&&str[i+1]==' '||str[i+1]=='\0')
{
i++;
continue;
}
str[j++]=str[i++];// if , str[i]==' '&&str[i+1]!=''
}
str[j]='\0';
}
タイトル76:2つのツリーと、その中の2つのnode(アドレスは空ではありません)が与えられ、この2つのnodeの共通の親ノードが与えられ、この親ノードと2つのノードのパスの和が最小になるように要求されます.あなたのプログラムの最悪の時間の複雑さを説明して、そして具体的な関数を実現して、関数の入出力は以下の関数の原型を参照してください:C++関数の原型:
strucy TreeNode{
TreeNode* left; //
TreeNode* right; //
TreeNode* father; //
};
TreeNode* LowestCommonAncestor(TreeNode* first,TreeNode* second){ }
解析:この問題では木のノードに親ノードへのポインタがあるので,比較的やりやすい.コードは次のとおりです.
int getHeight(TreeNode *node) {
int height = 0;
while (node) {
height++;
node = node->parent;
}
return height;
}
TreeNode* LowestCommonAncestor(TreeNode* first,TreeNode* second) {
int height1 = getHeight(first), height2 = getHeight(second), diff = height1 - height2;
if (diff < 0) {
diff = -diff;
while(diff--) {
second = second->parent;
}
} else {
while(diff--) {
first = first->parent;
}
}
while (first != second) {
first = first->parent;
second = second->parent;
}
return first;
}
ツリー構造の中に親ノードへのポインタがないと仮定すると、この問題はどうすればいいのでしょうか.剣指offerの上にはこのような状況に関する議論があり、下には他山の石がある.まず2つのノードへの経路を取得し、それから経路の中で最後の共通点を探すことに転化し、この共通点は2つのノードの最低の共通祖先である.
bool GetNodePath(TreeNode* pRoot, TreeNode* pNode, list& path)
{
if(pRoot == pNode)
return true;
path.push_back(pRoot);
bool found = false;
vector::iterator i = pRoot->m_vChildren.begin();
while(!found && i < pRoot->m_vChildren.end())
{
found = GetNodePath(*i, pNode, path);
++i;
}
if(!found)
path.pop_back();
return found;
}
TreeNode* GetLastCommonNode
(
const list& path1,
const list& path2
)
{
list::const_iterator iterator1 = path1.begin();
list::const_iterator iterator2 = path2.begin();
TreeNode* pLast = NULL;
while(iterator1 != path1.end() && iterator2 != path2.end())
{
if(*iterator1 == *iterator2)
pLast = *iterator1;
iterator1++;
iterator2++;
}
return pLast;
}
TreeNode* GetLastCommonParent(TreeNode* pRoot, TreeNode* pNode1, TreeNode* pNode2)
{
if(pRoot == NULL || pNode1 == NULL || pNode2 == NULL)
return NULL;
list path1;
GetNodePath(pRoot, pNode1, path1);
list path2;
GetNodePath(pRoot, pNode2, path2);
return GetLastCommonNode(path1, path2);
}
今日はこれで、まだ終わっていません.