zoukankan      html  css  js  c++  java
  • 2019字节跳动面试时手撕代码 54题(持续更新~)

    1. N 阶乘末尾0的个数。

    输入描述:

    输入为一行,n(1 ≤ n ≤ 1000)

    输出描述:

    输出一个整数,即题目所求
    解法:要判断末尾有几个0就是判断可以整除几次10。10的因子有5和2,而在0~9之间5的倍数只有一个,2的倍数相对较多,所以本题也就转换成了求N阶乘中有几个5的倍数。
    也就是每多出来一个5,阶乘末尾就会多出来一个0,这样n / 5就能统计完第一层5的个数,依次处理,就能统计出来所有5的个数。同一个思想两种写法。

     题解:

      要判断末尾有几个0就是判断可以整除几次10。10的因子有5和2,而在0~9之间5的倍数只有一个,2的倍数相对较多,所以本题也就转换成了求N阶乘中有几个5的倍数。也就是每多出来一个5,阶乘末尾就会多出来一个0,这样n / 5就能统计完第一层5的个数,依次处理,就能统计出来所有5的个数。同一个思想两种写法。

    参考代码:

     1 #include<iostream>
     2 using namespace std;
     3 int main()
     4 {
     5     int n;
     6     cin>>n;
     7     int count = 0;
     8     while(n)
     9     {
    10         n /= 5;     //算出当前数字中可以匹配5(5和5的倍数)的个数
    11         count += n; //累加之
    12     }
    13     cout<<count;
    14     return 0;
    15 }
    C++
    public class Main {
        public int calcuZero(int n) {
            int count = 0;
            for (int i = 1; i <= n; i++) {
                int cur = i;
                //如果因数中有一个5那么乘积中就会有一个0,所以计算每一个i中因数5的个数
                while (cur % 5 == 0) {
                    count++;
                    cur /= 5;
                }
            }
            return count;
        }
        public static void main(String[] args) {
            System.out.println(new Main().calcuZero(30));
        }
    }
    Java

     2.对称二叉树

    题解:

      判断一个数是否为镜像对称:先判断根,在判断左右子树。如果左右子树都为空那就是,如果左右子树不是同时为空那就不是

    当左右子树都存在的时候,判断他们的值是否相等,如果相等那么久递归的对他们的字节点判断(左边的左=右边的右;左边的右==右边的左)

     参考代码:

    /**
     * Definition for binary tree
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        bool isSymmetric(TreeNode *root) {
            if (!root)
                return true;
            return Symmetric(root->left, root->right);
        }
        bool Symmetric(TreeNode *left, TreeNode *right){
            if (!left && !right)
                return true;
            if (!left || !right)
                return false;
            if (left->val == right->val){
                return (Symmetric(left->left, right->right) && Symmetric(right->left, left->right));
            }
            return false;
        }
    };
    C++
    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        public boolean isSymmetric(TreeNode root) 
        {
            if(root==null) return true;
    
            return work(root.left,root.right);
        }
    
        public boolean work(TreeNode l,TreeNode r)
        {
            if(l==null && r==null) return true;
            if(l==null || r==null) return false;
    
            if(l.val==r.val)
            {
                return work(l.left,r.right) && work(l.right,r.left);
            }
            else return false;
        }
    }
    Java

     3.给定数组,从数组中取出n个不复用的数的和为sum

     题解;

    一. DFS

    参考代码:

    void findd(vector<int>&vr,int pos,int sum,int m,int& res){
        if(sum==m){
            res++;
            return;
        }
        else if(sum>m){
            return;
        }else{
            if(pos<vr.size()){
                sum+=vr[pos];
                findd(vr,pos+1,sum,m,res);
                sum-=vr[pos];
                findd(vr,pos+1,sum,m,res);
            }
        }
    }
    C++

    二. DP 

    dp[i][j]:表示前i个数,和为j时有多少种情况。

    转移方程: dp[i][j]=dp[i-1][j]+dp[i-1][j-v[i]](j>=v[i]); 

     dp[i][j]=dp[i-1][j];(j<v[i])

    参考代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 
     4 int main(){
     5     int n=0;
     6     int m=0;
     7     while(cin>>n>>m){
     8         vector<int> vr(n);
     9         for(int i=0;i<n;++i){
    10             cin>>vr[i];
    11         }
    12         sort(vr.begin(),vr.end(),greater<int>());
    13         vector<vector<long long int>>dp(n,vector<long long int>(m+1,0));
    14         for(int i=0;i<n;++i){
    15             dp[i][0]=1;
    16         }
    17         for(int i=1;i<=m;i++){
    18             if(vr[0]>m)//过滤
    19                 break;
    20             if(vr[0]==i)
    21                 dp[0][i]=1;
    22             else
    23                 dp[0][i]=0;
    24         }
    25         for(int i=1;i<n;++i){
    26             if(vr[i]>m)  //过滤
    27                 continue;
    28             for(int j=1;j<=m;++j){
    29                 if(j-vr[i]>=0)
    30                     dp[i][j]=dp[i-1][j]+dp[i-1][j-vr[i]];
    31                 else
    32                     dp[i][j]=dp[i-1][j];
    33             }
    34         }
    35         cout<<dp[n-1][m]<<endl;
    36     }
    37     return 0;
    38 }
    39  
    C++

    未完待续~

  • 相关阅读:
    iOS 关于使用xib创建cell的两种初始化方式
    KVO的初级使用
    通知的初级使用
    C语言的变量 常量
    C语言的编译 链接
    1 hello word
    java 中 == 与 equals引出的字符串比较
    02PSP0级及登陆界面开发
    00软工课程引言
    06动手动脑
  • 原文地址:https://www.cnblogs.com/csushl/p/12069926.html
Copyright © 2011-2022 走看看