目录
1.剑指Offer
面试题55:二叉树的深度
题目描述:输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
思路:递归
代码:
class Solution {
public:
int TreeDepth(TreeNode* pRoot)
{
if(pRoot==nullptr) return 0;
int leftDepth=TreeDepth(pRoot->left);
int rightDepth=TreeDepth(pRoot->right);
return leftDepth>rightDepth?leftDepth+1:rightDepth+1;
}
};
面试题55:平衡二叉树
题目描述:输入一棵二叉树,判断该二叉树是否是平衡二叉树。
思路:后序遍历,在遍历每个节点前已经遍历了它的左右子树,并记录下了它的深度
代码:
class Solution {
public:
bool IsBalanced_Solution(TreeNode* pRoot) { //判断每个节点时记录下它的深度
int depth=0;
return IsBalanced(pRoot,depth);
}
bool IsBalanced(TreeNode* pRoot, int &depth){
if(pRoot==nullptr){
depth=0;
return true;
}
int left,right;
if(IsBalanced(pRoot->left,left)&&IsBalanced(pRoot->right,right)){
int diff=left-right;
if(diff<=1&&diff>=-1){ //注意是&&
depth=(left>right?left+1:right+1);
return true;
}
}
return false;
}
};
面试题33: 二叉搜索树的后序遍历序列
题目描述:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路:递归、后序遍历
代码:
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
int len=sequence.size();
if(len==0||sequence.empty()){
return false;
}
int rootval=sequence[len-1];
vector<int> leftseq,rightseq;
int i=0;
for(;i<len-1;i++){
if(sequence[i]>rootval){
break;
}
leftseq.push_back(sequence[i]);
}
int j=i;
for(;j<len-1;j++){
if(sequence[j]<=rootval){
return false;
}
rightseq.push_back(sequence[j]);
}
bool left=true;
bool right=true;
if(i>0){
left=VerifySquenceOfBST(leftseq);
}
if(j<len-1){
right=VerifySquenceOfBST(rightseq);
}
return left&&right;
}
};
2.华为机试题
例1:字符串分隔
题目描述:
•连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组;
•长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
输入描述:
连续输入字符串(输入2次,每个字符串长度小于100)
输出描述:
输出到长度为8的新字符串数组
示例1
输入
abc
123456789
输出
abc00000
12345678
90000000
思路:str.substr()、str.append()
代码:
#include <iostream>
using namespace std;
int main(){
string str;
while(getline(cin,str)){
while(str.size()>8){
cout << str.substr(0,8) << endl;
str=str.substr(8);
}
cout << str.append(8-str.size(),'0') << endl;
}
return 0;
}
例2:进制转换
题目描述:
写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串。(多组同时输入 )
输入描述:
输入一个十六进制的数值字符串。
输出描述:
输出该数值的十进制字符串。
示例1
输入
0xA
输出
10
思路:从低位开始计算,每次乘以16
代码:
#include <iostream>
using namespace std;
int main()
{
int a;
while(cin>>hex>>a){
cout<<a<<endl;
}
}
#include <iostream>
#include <string>
using namespace std;
int main(){
string str;
while(getline(cin,str)){
int len=str.length();
if(len<2){
continue;
}
if(str[0]!='0'&&str[1]!='x'){ //对十六进制的转换
continue;
}
int res=0;
int flag=1;
for(int i=len-1;i>1;i--){
if(str[i]>='0'&&str[i]<='9'){
res+=(str[i]-'0')*flag; //注意数字转换
}
else if(str[i]>='A'&&str[i]<='F'){
res+=(str[i]-'A'+10)*flag; //对应字母的转换
}
else{
continue;
}
flag*=16;
}
cout << res << endl;
}
return 0;
}
解析:
(1)
string.h是C语言中字符串操作函数的头文件,不需要使用名字空间
cstring是c++对C语言中的strcpy之类的函数申明,包含cstring之后,就可以在程序中使用C语言风格的strcpy之类的函数。
string是c++语言中string类模板的申明
(2)二者都是从终端读入字符串。功能为
1、 gets功能为读入一行,并将换行符转换为字符串结束符。
2、 scanf("%s",s);读入时,遇到空白字符,包括空格,制表符,换行符时均会停止输入。
(3)
旧的C++头文件名如<iostream.h>将会继续被支持,尽管它们不在官方标准中。这些头文件的内容不在名字空间std 中。
新的C++头文件如<iostream>包含的基本功能和对应的旧头文件相同,但头文件的内容在名字空间std 中。(在标准化的过程中,库中有些部分的细节被修改了,所以旧头文件和新头文件中的实体不一定完全对应。)
标准C 头文件如<stdio.h>继续被支持。头文件的内容不在std 中。
具有C 库功能的新C++头文件具有如<cstdio>这样的名字。它们提供的内容和相应的旧C 头文件相同,只是内容在std 中。
所有这些初看有点怪,但不难习惯它。最大的挑战是把字符串头文件理清楚:
<string.h>是旧的C 头文件,对应的是基于char*的字符串处理函数;
<cstring>是对应于旧C 头文件的std 版本;
<string>是包装了std 的C++头文件,对应的是新的string 类。
https://www.cnblogs.com/rainbow70626/p/5582586.html
例3:质数因子
题目描述:
功能:输入一个正整数,按照从小到大的顺序输出它的所有质数的因子(如180的质数因子为2 2 3 3 5 )
最后一个数后面也要有空格
详细描述:
函数接口说明:
public String getResult(long ulDataInput)
输入参数:
long ulDataInput:输入的正整数
返回值:
String
输入描述:
输入一个long型整数
输出描述:
按照从小到大的顺序输出它的所有质数的因子,以空格隔开。最后一个数后面也要有空格。
示例1
输入
180
输出
2 2 3 3 5
思路:
代码:
#include <iostream>
using namespace std;
int main(){
long num;
while(cin >> num){
while(num!=1){
for(int i=2;i<=num;i++){
if(num%i==0){
num=num/i;
cout << i << ' '; //不能加ends
break;
}
}
}
}
return 0;
}