Middle-题目75:113. Path Sum II

本文介绍了一种使用回溯法解决二叉树路径求和问题的方法,即寻找所有从根节点到叶子节点的路径,使得路径上的节点值之和等于给定的目标值。

题目原文:
Given a binary tree and a sum, find all root-to-leaf paths where each path’s sum equals the given sum.
For example:
Given the below binary tree and sum = 22,

              5
             / \
            4   8
           /   / \
          11  13  4
         /  \    / \
        7    2  5   1

return
[
[5,4,11,2],
[5,8,4,5]
]
题目大意:
给出一个二叉树和目标和值,输出从根节点到叶子节点的路径为目标和值的所有路径。
题目分析:
还是一个回溯法,backtrack(List<List<Integer>> list, List<Integer> sublist, TreeNode root, int sum)维护搜索过程,其中sum记录还剩下的和值,如果sum恰好为当前节点值且当前节点是叶子节点(想想为什么不能是root==null的时候停止?这样每个路径会添加两遍),则停止搜索,否则递归向子树搜索。
源码:(language:java)

public class Solution {
    public List<List<Integer>> pathSum(TreeNode root, int sum) {
        List<List<Integer>> list = new ArrayList<List<Integer>>();
        if(root!=null)
            backtrack(list, new ArrayList<Integer>(), root, sum);
        return list;
    }
    private void backtrack(List<List<Integer>> list, List<Integer> sublist, TreeNode root, int sum) {

            sublist.add(root.val);  
            if(sum-root.val == 0 && root.left == null && root.right == null)
                list.add(new ArrayList<Integer>(sublist));
            if(root.left!=null)
                backtrack(list, sublist, root.left, sum-root.val);
            if(root.right!=null)
                backtrack(list, sublist, root.right, sum-root.val);
            sublist.remove(sublist.size()-1);

    }
}

成绩:
3ms,beats 14.57%,众数3ms,51.99%

实验一、Hive内置函数 1、聚合函数 1.1 统计员工信息表employess_table中的部门数。 SELECT COUNT(DISTINCT staff_dept) dept_num FROM hive_database.employess_table; 1.2 获取商品销售表sales_table中每个省份销售额最高的城市。 SELECT province,SUM(sales_amount) province_amount FROM hive_database.sales_table GROUP BY province; 1.3 获取商品销售表sales_table中每个省份销售额最高的城市。 SELECT province,city,sales_amount FROM hive_database.sales_table WHERE sales_amount IN( SELECT MAX(sales_amount) FROM hive_database.sales_table GROUP BY province); 1.4 获取商品销售表sales_table中每个省份包含的城市。 SELECT province,COLLECT_SET(city) city_set FROM hive_database.sales_table GROUP BY province; 2、数学函数 获取商品销售表sales_table中每个省份的平均销售额。 SELECT province,ROUND(AVG(sales_amount),2) FROM hive_database.sales_table GROUP BY province; 3、集合函数 判断学生考试成绩表student_exam_table中意向大学填写了Peking University的学生。 SELECT student_name, ARRAY_CONTAINS(intent_university,"Peking University") FROM hive_database.student_exam_table; 4、类型转换函数 获取员工信息表employess_table中员工薪资的整数数据。 SELECT staff_salary,CAST(staff_salary AS INT) FROM hive_database.employess_table; 5、日期函数 在数据库hive_database中创建日期表date_table。 CREATE EXTERNAL TABLE IF NOT EXISTS hive_database.date_table( start_date STRING, end_date STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' STORED AS textfile LOCATION '/hive_data/test_date'; 向日期表date_table中插入两条数据。 INSERT INTO TABLE hive_database.date_table VALUES ("2020-01-08 12:23:43","2020-06-16 06:13:23"), ("2020-05-25 10:11:22","2020-11-28 11:53:03"); 5.1 计算日期表date_table中,开始日期与结束日期相差的月以及开始日期与当前日期相差的月。 SELECT start_date, end_date, CURRENT_TIMESTAMP() now_date, ROUND(MONTHS_BETWEEN(CURRENT_TIMESTAMP(),start_date),1) between_now_date, ROUND(MONTHS_BETWEEN(end_date,start_date),1) between_start_end_date FROM hive_database.date_table; 5.2 在日期表date_table中,将开始日期延迟7天,结束日期提前5天。 SELECT start_date, end_date, DATE_ADD(start_date,7) add_startdate, DATE_SUB(end_date,5) sub_enddate FROM hive_database.date_table; 5.3 将日期表date_table中,开始日期的时间格式化为yyyy/MM/dd HH的形式。 SELECT start_date, DATE_FORMAT(start_date,'yyyy/MM/dd HH') format_date FROM hive_database.date_table; 6、条件函数 6.1 根据员工信息表employess_table中员工年龄数据,判断员工属于中年还是青年。 SELECT staff_name, IF(staff_age >= 40,"middle age","youth") FROM employess_table; 6.2 根据员工信息表employess_table中员工薪资数据,判断员工薪资级别。 SELECT staff_name,CASE WHEN staff_salary < 5000 THEN "low" WHEN staff_salary >= 5000 AND staff_salary < 8000 THEN "middle" ELSE "high" END FROM hive_database.employess_table; 7、字符串函数 7.1 将商品销售表sales_table中省份名和城市名拼接在一起。 SELECT CONCAT_WS(':',province,city) FROM hive_database.sales_table; 7.2 去除员工信息表employess_table中员工姓名中的空格。 SELECT staff_name, REGEXP_REPLACE(staff_name,'\\s','') FROM hive_database.employess_table; 7.3 获取员工信息表employess_table中员工的姓氏。 SELECT SUBSTR(staff_name, INSTR(staff_name,' ')) FROM hive_database.employess_table; 7.4 重命名员工信息表部门名称,去除部门名称后的“ Department”字符串,在部门名 称前添加“DEPT-”字符串。 SELECT staff_dept, LPAD(SUBSTR(staff_dept, 0, (LENGTH(staff_dept)-LENGTH(SUBSTR(staff_dept, INSTR(staff_dept,' '))))), (LENGTH(staff_dept)-LENGTH(SUBSTR(staff_dept, INSTR(staff_dept,' ')))+5),'DEPT-') FROM hive_database.employess_table; 8、表生成函数 8.1 拆分学生成绩表student_exam_table的意向大学数据。 SELECT intent_university,university_new FROM hive_database.student_exam_table LATERAL VIEW explode(intent_university) intent_university AS university_new; 8.2 拆分学生成绩表student_exam_table的文综或理综数据。 SELECT humanities_or_sciences,key,value FROM hive_database.student_exam_table LATERAL VIEW explode(humanities_or_sciences) humanities_or_sciences AS key,value; 8.3 拆分URL地址数据。 SELECT PARSE_URL_TUPLE("https://www.sogou.com/sogou?prs=5&rfg=1",'HOST','PATH','QUERY') AS (host,path,query); 实验二、Hive自定义函数 UDF(用户自定义函数): 1、打开eclipse,选择新建一个Maven项目,配置Maven项目的组织名(GroupId)和项目工程名(ArtifactId),分别设置为“cn.itcast”和“HIveFunction”。 2、项目中的XML文件pom.xml用于管理Maven项目依赖的配置文件,本项目需要在配置文件pom.xml中添加用于开发Hive程序的依赖。其中添加的依赖需要与Hive版本对应。 <dependencies> <!-- Hive依赖--> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>1.2.1</version> </dependency> </dependencies> 之后点击保存即可,需要等待后台自动下载相关依赖包,界面右下角可查看下载进度,中间不要停止,否则会导致报错。 3、选中并右击项目HiveFunction 中的“java”目录,在弹出的菜单栏中依次选择“New→Package”,从而新建Package包,将名称命名为cn.itcast.hive。 4、选中包“cn.itcast.hive”并单击鼠标右键,在弹出的菜单中依次选择“New→Java Class”新建Java类,将Java类命名为hiveUDF。 5、编写UDF类,在类hiveUDF中实现比较两列数值是否相等,具体内容如下。 package cn.itcast.hive; import org.apache.hadoop.hive.ql.exec.UDF; public class hiveUDF extends UDF { public String evaluate(int col1,float col2){ if (col1>col2){ return "max:"+col1+",diffe:"+(col1-col2); }else if(col1<col2){ return "max:"+col2+",diffe:"+(col2-col1); }else { return "0"; } } } 6、右键点击新建的UDF类,选择“Export→JAR file”封装导出jar包,之后勾选需要导出的“hiveUDF”类文件,设置jar包导出位置, 封装的jar包名称为“hive_UDF.jar” 7、在虚拟机node-01中创建目录/export/jar/,在目录/export/jar/中执行“rz”命令,将hive_UDF.jar上传到虚拟机node-01目录/export/jar/下。 mkdir -p /export/jar/ cd /export/jar/ 8、在虚拟机node-02中使用Hive客户端工具Beeline,远程连接虚拟机node-01的HiveServer2服务操作Hive,将虚拟机node-01中目录/export/jar/下的hive_UDF.jar添加到Hive中。之后执行“LIST JARS;”命令,查看当前Hive中包含的jar包。 ADD JAR /export/jar/hive_UDF.jar; LIST JARS; 9、在Hive客户端工具Beeline中,创建临时函数CompareSize。执行“SHOW FUNCTIONS LIKE 'Com*';”命令,查看创建的函数CompareSize,若不指定子句LIKE,则会查询Hive的所有函数包括内置函数。 CREATE TEMPORARY FUNCTION CompareSize AS 'cn.itcast.hive.hiveUDF'; SHOW FUNCTIONS LIKE 'Com*'; 10、使用函数CompareSize,比较员工信息表employess_table中列employess_table和staff_age的值,命令如下。 SELECT CompareSize(staff_age,late_deduction) FROM hive_database.employess_table; UDTF(用户自定表生成函数): 1、UDTF(用户自定表生成函数)的创建、封装、上传过程和UDF(用户自定义函数)完全一致,在上个实验创建的Maven工程的基础上进行类文件的新建即可,无需再次添加依赖信息。 主要区别是创建的java类文件名称为“hiveUDTF”,封装的jar包名称为“hive_UDTF.jar”类文件的具体内容见提供的文件“hiveUDTF.java”。 2、在虚拟机node-02中使用Hive客户端工具Beeline,远程连接虚拟机node-01的HiveServer2服务操作Hive,将虚拟机node-01中目录/export/jar/下的hive_UDTF.jar添加到Hive中。之后执行“LIST JARS;”命令,查看当前Hive中包含的jar包。 ADD JAR /export/jar/hive_UDTF.jar; LIST JARS; 3、创建临时函数spiltname。执行SHOW FUNCTIONS LIKE 'spilt*'命令,查看创建的函数spiltname,若不指定子句LIKE,则会查询Hive的所有函数包括内置函数。 CREATE TEMPORARY FUNCTION spiltname AS 'cn.itcast.hive.hiveUDTF'; SHOW FUNCTIONS LIKE 'spilt*'; 4、使用函数spiltname,将员工信息表employess_table中员工姓名拆分为两列。 SELECT spiltname(staff_name) FROM hive_database.employess_table; UDAF(用户自定聚合函数): 1、UDAF(用户自定聚合函数)的创建、封装、上传过程和UDF(用户自定义函数)完全一致,在上个实验创建的Maven工程的基础上进行类文件的新建即可,无需再次添加依赖信息。 主要区别是创建的java类文件有两个,名称分别为“hiveUDAFCollect”和“hiveUDAFMain”,封装jar包时需要将这两个类文件进行封装,同时jar包名称为“hive_UDAF.jar”。两个类文件具体内容见提供的文件“hiveUDAFCollect.java”和“hiveUDAFMain.java”。 2、在虚拟机node-02中使用Hive客户端工具Beeline,远程连接虚拟机node-01的HiveServer2服务操作Hive,将虚拟机node-01中目录/export/jar/下的hive_UDAF.jar添加到Hive中。 添加jar包并创建: ADD JAR /export/jar/hive_UDAF.jar; 3、创建临时函数collectstr。执行SHOW FUNCTIONS LIKE ' collect *'命令,查看创建的函数collectstr,若不指定子句LIKE,则会查询Hive的所有函数包括内置函数。 CREATE TEMPORARY FUNCTION collectstr AS 'cn.itcast.hive.hiveUDAFCollect'; SHOW FUNCTIONS LIKE 'collect*'; 4、使用函数collectstr,将学生成绩表student_exam_table中所有学生姓名合并到一 行数据中。 SELECT collectstr(student_name) from hive_database.student_exam_table;
11-07
dict_code3_to_cols保留的数据, 我想要这种效果’1’ ={‘2’,‘3’} 并且不要小数点,给我全部的代码,以下为当前代码def call_external_script(self): selected_sheets = [] for item, state in self.check_states.items(): if state: sheet_name = self.tree.item(item, "values")[1] selected_sheets.append(sheet_name) if not selected_sheets: messagebox.showwarning("提示", "请至少选择一个工作表") return file_path = self.file_path.get() if not file_path: messagebox.showwarning("提示", "请先选择Excel文件") return try: # 初始化数据结构 arr_code1 = [] # 第一个数组 arr_code2 = [] # 第二个数组 arr_code3 = [] # 第三个数组 dict_mutex = {} # 第四个字典 dict_code3_to_cols = {} # 第五个字典 for sheet in selected_sheets: df = pd.read_excel(file_path, sheet_name=sheet) # 验证必要列存在 required_columns = ['code1', 'code2', 'code3', '互斥1'] if not all(col in df.columns for col in required_columns): messagebox.showwarning("警告", f"工作表 '{sheet}' 缺少必要列") continue # 获取code3和互斥1之间的列名 all_cols = df.columns.tolist() try: code3_idx = all_cols.index('code3') mutex1_idx = all_cols.index('互斥1') middle_cols = all_cols[code3_idx+1:mutex1_idx] # 中间列 except ValueError: middle_cols = [] # 处理每一行数据 for _, row in df.iterrows(): # 值拆分与空值过滤函数 def split_values(val): if pd.isna(val): return [] parts = [v.strip() for v in str(val).split(',')] return [v for v in parts if v] # 双重过滤确保无空值 # 填充前三个数组 arr_code1.extend(split_values(row['code1'])) arr_code2.extend(split_values(row['code2'])) arr_code3.extend(split_values(row['code3'])) # 填充互斥字典(第四个数组) mutex1_val = str(row['互斥1']).strip() if not pd.isna(row['互斥1']) else "" if mutex1_val: mutex2_val = "" if '互斥2' in df.columns and not pd.isna(row['互斥2']): mutex2_val = str(row['互斥2']).strip() dict_mutex[mutex1_val] = mutex2_val # 填充第五个字典(跳过空值保存) for code3_val in split_values(row['code3']): if code3_val not in dict_code3_to_cols: dict_code3_to_cols[code3_val] = {} # 处理中间列 for col in middle_cols: col_vals = split_values(row[col]) if col_vals: # 关键:仅当有值时保存 dict_code3_to_cols[code3_val][col] = col_vals # ==== 结果写入Excel ==== from openpyxl import load_workbook wb = load_workbook(file_path) # 删除原有结果页 for sheet_name in ['数组结果', '互斥字典', 'code3映射']: if sheet_name in wb.sheetnames: del wb[sheet_name] # 写入数组结果 ws_arr = wb.create_sheet('数组结果') ws_arr.append(['code1数组', 'code2数组', 'code3数组']) max_len = max(len(arr_code1), len(arr_code2), len(arr_code3)) for i in range(max_len): row = [ arr_code1[i] if i < len(arr_code1) else "", arr_code2[i] if i < len(arr_code2) else "", arr_code3[i] if i < len(arr_code3) else "" ] ws_arr.append(row) # 写入互斥字典 ws_mutex = wb.create_sheet('互斥字典') ws_mutex.append(['互斥1(键)', '互斥2(值)']) for k, v in dict_mutex.items(): ws_mutex.append([k, v]) # 写入code3映射字典(跳过空记录) ws_map = wb.create_sheet('code3映射') ws_map.append(['code3值', '映射列名', '映射值']) for code3_val, col_dict in dict_code3_to_cols.items(): # 仅当有映射列时才写入 if col_dict: for col_name, val_list in col_dict.items(): vals_str = ','.join(val_list) if val_list else "" ws_map.append([code3_val, col_name, vals_str]) wb.save(file_path) result_info = [ f"code1数组: {len(arr_code1)}元素", f"code2数组: {len(arr_code2)}元素", f"code3数组: {len(arr_code3)}元素", f"互斥字典: {len(dict_mutex)}键值对", f"code3映射: {len(dict_code3_to_cols)}个键,{sum(len(v) for v in dict_code3_to_cols.values())}个有效映射" ] messagebox.showinfo("处理完成", "\n".join(result_info)) except Exception as e: import traceback error_details = f"错误类型: {type(e).__name__}\n错误信息: {str(e)}\n堆栈跟踪:\n{traceback.format_exc()}" messagebox.showerror("严重错误", f"执行失败:\n{error_details}")
09-02
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值