编程之旅-Day38

目录

Day38-学习内容:

           1.剑指Offer

面试题55:二叉树的深度

面试题55:平衡二叉树

面试题33: 二叉搜索树的后序遍历序列

 2.华为机试题

例1:字符串分隔

例2:进制转换

例3:质数因子


 

 

1.剑指Offer

面试题55:二叉树的深度

题目描述:输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。

思路:递归

扫描二维码关注公众号,回复: 6122746 查看本文章

代码:

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;
}

猜你喜欢

转载自blog.csdn.net/linyuhan3232/article/details/89509608