力扣 路径总和

每日一题

路径总和. - 力扣(LeetCode)

class Solution {
public:
    bool flag = 0;
    void dfs(TreeNode* root,int ans,int targetSum){
        if(root==nullptr) return; 
        if(root->left==nullptr&&root->right==nullptr&&ans+root->val==targetSum)flag=1;//确定走到叶子节点,并且该叶子节点的ans=目标值            
        dfs(root->left,ans+root->val,targetSum);//遍历二叉树
        dfs(root->right,ans+root->val,targetSum);
        return;
    }    
    bool hasPathSum(TreeNode* root, int targetSum) {
        if(root == nullptr) return false;//树为空直接返回false
        dfs(root,0,targetSum);
       return flag;
    }
};

八股

什么是 C++ 中的常量表达式? 有什么用途?

在 C++ 中,常量表达式(constexpr)是指在编译时就能被计算出来的表达式。它的关键特性是:编译器能够在程序编译阶段就确定表达式的值,而不是等到程序运行时才计算。常量表达式常常用于提高程序效率和简化代码的编写。

常量表达式的用途:

  1. 编译时计算:常量表达式的最主要用途是让某些计算在编译时就完成,减少运行时的计算负担。这样可以提高程序的执行效率,尤其是对于复杂计算或大规模数据处理的场景。
  2. 常量数组的大小:你可以使用 constexpr 定义数组的大小、模板参数等,这样可以确保编译时计算确定值,从而避免运行时的额外开销。
  3. 模板编程:在模板元编程中,constexpr 被广泛用于计算常量值,从而在编译时完成各种类型和计算的推导。例如,使用 constexpr 可以实现一些编译期的算法和常量初始化。
  4. 更强的类型检查:constexpr 确保某些值在编译时就确定,这帮助编译器在编译过程中进行更多的检查,并提前发现潜在的错误。

如何判断一个表达式是否是常量表达式?

要判断一个表达式是否是常量表达式,通常依赖于表达式的上下文和它是否符合编译时计算的条件。

使用 constexpr 关键字

最直接的方式是使用 constexpr 关键字来声明一个变量或函数。如果表达式满足常量表达式的要求,编译器会在编译时计算出其值。

编译时检测表达式是否为常量表达式

C++11 引入了 std::is_constant_evaluated 来检测一个表达式是否是在常量求值上下文中被求值。可以用来判断当前代码是否在常量表达式的上下文中执行。

### 常见的Java LeetCode题目类型及解题思路 #### 题目类型概述 LeetCode上的Java题目涵盖了多种算法和数据结构的应用场景,主要包括数组操作、字符串处理、链表管理、树遍历以及动态规划等问题。以下是几种常见类型的描述: - **数组与矩阵**:涉及查找最大子序列、旋转图像等任务。 - **字符串匹配与编辑距离**:如判断回文串、计算两个字符串之间的最小编辑次数。 - **链表操作**:反转单向/双向链表节点顺序或者检测环形结构的存在与否。 - **二叉树及相关概念**:前序、中序、后序遍历;平衡判定;路径总和求解等等。 #### 示例一:两数之和 (Two Sum) 给定一个整型数组`nums` 和目标值 `target`, 找到数组中的两个不同位置 i,j 的元素使得它们相加等于 target, 返回这两个索引[i,j]. ```java public int[] twoSum(int[] nums, int target){ Map<Integer,Integer> map=new HashMap<>(); for(int i=0;i<nums.length;i++){ if(map.containsKey(target - nums[i])){ return new int[]{map.get(target - nums[i]),i}; } map.put(nums[i],i); } throw new IllegalArgumentException("No solution"); } ``` 此方法利用哈希映射来存储已经访问过的数值及其对应的下标,在后续迭代过程中快速定位是否存在满足条件的一对数字[^1]。 #### 示例二:最长公共前缀(Longest Common Prefix) 编写函数找出多个输入字符串列表中最长共有的起始部分。如果不存在这样的共同开头,则返回空字符"". ```java public String longestCommonPrefix(String[] strs) { if(strs==null||strs.length==0)return ""; String prefix=strs[0]; for(int i=1;i<strs.length;i++) { while(strs[i].indexOf(prefix)!=0){ prefix=prefix.substring(0,prefix.length()-1); if(prefix.isEmpty())return ""; } } return prefix; } ``` 通过逐步缩短候选词长度直至找到所有单词都共享的部分作为最终结果。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值