Longest Absolute File Path

本文详细解析了如何求解最长的文件路径问题,通过使用hashmap记录目录深度和长度,结合字符串处理技巧,实现了高效的解决方案。

1. 解析

 题目大意,求解最长的文件路径。

2. 分析

参考@Grandyang的博客,该题的难点在于如何记录当前的目录深度和对应的目录长度,字符串由'a-z','.','\n','\t'4种不同的字符组成,'.'代表当前为文件,换行符'\n'代表下一层目录开始的标记,空格符'\t'表示目录的深度,为避免重复检测,用hashmap记录当前目录的深度和对应的目录长度,每一层的状态只有两种,文件或者目录,所以每次我们一直检测到'\n'或者'\t',之前的即为目录或文件名,若为'\n',判断之前的是目录还是文件名,若为文件名,更新最大长度,若为目录,则记录当前深度和对应的长度。

例如:"dir\n\tsubdir1\n\tsubdir2\n\t\tfile.ext",为方便查看,将layer_to_file中的value值替换成了具体的字符串,实则为它所对应的长度。

检测"dir",下一个字符为'\n',当前不是文件,建立当前目录和深度的关系,即layer_to_file = [1, "dir/"]

往下检测'\t',层数layer = 1,检测"subdir1",下一个字符为'\n',当前不是文件,建立当前目录和深度的关系,

即layer_to_file = [1, "dir/"],[2, "dir/subdir1/"]

.....

class Solution {
public:
    int lengthLongestPath(string input) {
        if (input.empty() || input.find('.') == string::npos) return 0;
        unordered_map<int, int> layer_to_len{{0, 0}};
        int res = 0;
        int start = 0, layer = 0;
        
        for (int i = 0; i < input.length(); ++i){
            start = i;
            while (i < input.length() && input[i] != '\n' && input[i] != '\t') ++i;
            if (i >= input.length() || input[i] == '\n'){
                string str = input.substr(start, i - start); //获取目录名或者文件名
                if (str.find('.') != string::npos){ //当前为文件,则更新
                    res = max(res, layer_to_len[layer] + (int)str.length());
                }
                else{ //当前为目录,记录当前目录深度和对应的长度
                    layer_to_len[layer + 1] = layer_to_len[layer] + (int)str.length() + 1; //以'/'划分目录,所以要加上1
                }                   
                layer = 0;
            }
            else{ //检测到'\t',深度加1
                layer++;
            }
        }
        
        return res;
    }
};

3. 类似的题目 

Flatten Nested List Iterator

Mini Parser

 [1]https://www.cnblogs.com/grandyang/p/5806493.html

是否有问题 # https://www.gyan.dev/ffmpeg/builds/ from pydub import AudioSegment, effects from pydub.silence import detect_silence import numpy as np import os import sys def merge_mp3_with_crossfade_and_normalization(file1, file2, output_file, crossfade_duration=1000, target_dBFS=-20.0): if not os.path.exists(file1): raise FileNotFoundError(f"文件 ‘{file1}’ 不存在") if not os.path.exists(file2): raise FileNotFoundError(f"文件 ‘{file2}’ 不存在") print(f"开始处理: {file1} 和 {file2}“) print(f"交叉淡入淡出时长: {crossfade_duration}ms, 目标分贝: {target_dBFS}dBFS”) try: # 1. 加载音频文件 audio1 = AudioSegment.from_mp3(file1) audio2 = AudioSegment.from_mp3(file2) # 打印原始音频信息 print( f"原始音频1信息: 时长={len(audio1) / 1000:.2f}s, 分贝={audio1.dBFS:.2f}dBFS, 采样率={audio1.frame_rate}Hz") print( f"原始音频2信息: 时长={len(audio2) / 1000:.2f}s, 分贝={audio2.dBFS:.2f}dBFS, 采样率={audio2.frame_rate}Hz") # 2. 统一采样率(取较高的采样率) target_frame_rate = max(audio1.frame_rate, audio2.frame_rate) if audio1.frame_rate != target_frame_rate: print(f"调整音频1采样率: {audio1.frame_rate}Hz -> {target_frame_rate}Hz") audio1 = audio1.set_frame_rate(target_frame_rate) if audio2.frame_rate != target_frame_rate: print(f"调整音频2采样率: {audio2.frame_rate}Hz -> {target_frame_rate}Hz") audio2 = audio2.set_frame_rate(target_frame_rate) # 3. 统一分贝(音量标准化) def normalize_audio(audio, target_dB): “”“将音频调整到目标分贝值”“” current_dB = audio.dBFS gain = target_dB - current_dB print(f"应用增益: {gain:.2f}dB (当前: {current_dB:.2f}dBFS -> 目标: {target_dB:.2f}dBFS)“) return audio.apply_gain(gain) audio1 = normalize_audio(audio1, target_dBFS) audio2 = normalize_audio(audio2, target_dBFS) # 4. 优化交叉淡入淡出位置(自动检测静音段) def find_best_crossfade_position(audio, duration_ms): “”“在音频末尾寻找最佳交叉淡入淡出位置””" # 检测音频末尾的静音段 silence_ranges = detect_silence( audio[-duration_ms * 2:], min_silence_len=100, silence_thresh=-50 ) if silence_ranges: # 使用最长的静音段 longest_silence = max(silence_ranges, key=lambda s: s[1] - s[0]) start_pos = len(audio) - duration_ms * 2 + longest_silence[0] print(f"在音频1末尾找到静音段: {longest_silence[1] - longest_silence[0]}ms") return start_pos return len(audio) - duration_ms # 计算实际交叉位置 actual_crossfade_start = find_best_crossfade_position(audio1, crossfade_duration) actual_crossfade_duration = min(crossfade_duration, len(audio1) - actual_crossfade_start) # 5. 应用交叉淡入淡出效果 print(f"应用交叉淡入淡出: 位置={actual_crossfade_start / 1000:.2f}s, 时长={actual_crossfade_duration}ms") # 提取音频1的末尾部分(用于淡出) fade_out_part = audio1[actual_crossfade_start:] # 提取音频2的开头部分(用于淡入) fade_in_part = audio2[:actual_crossfade_duration] # 应用淡入淡出效果 fade_out_part = fade_out_part.fade_out(actual_crossfade_duration) fade_in_part = fade_in_part.fade_in(actual_crossfade_duration) # 合并淡入淡出部分 crossfade = fade_out_part.overlay(fade_in_part) # 6. 拼接完整音频 # 第一部分(直到交叉点) part1 = audio1[:actual_crossfade_start] # 第二部分(从交叉点之后开始) part2 = audio2[actual_crossfade_duration:] # 组合所有部分 combined = part1 + crossfade + part2 # 7. 导出合并后的音频 # 确保输出目录存在 output_dir = os.path.dirname(output_file) or “.” if not os.path.exists(output_dir): os.makedirs(output_dir) print(f"已创建输出目录: {output_dir}“) # 应用压缩器效果使音量更稳定 combined = effects.compress_dynamic_range(combined, threshold=-10.0, ratio=4.0) # 导出文件 combined.export( output_file, format=“mp3”, bitrate=“192k”, # 设置比特率 tags={“artist”: “Merged Audio”, “title”: “Combined Track”} ) print(f"合并完成!输出文件: {output_file}”) print(f"最终音频信息: 时长={len(combined) / 1000:.2f}s, 分贝={combined.dBFS:.2f}dBFS") return True except Exception as e: print(f"处理过程中出错: {str(e)}", file=sys.stderr) return False 使用示例 if name == “main”: 替换为你的实际文件路径 input_file1 = “./mb_vedios.mp3” input_file2 = “./s_z_vedios.mp3” output_file = “./combined_audio2.mp3” 可选参数(根据需要调整) crossfade_duration = 1500 # 交叉淡入淡出时长(毫秒) target_volume = -12.0 # 目标分贝值 # 执行合并 success = merge_mp3_with_crossfade_and_normalization( input_file1, input_file2, output_file, crossfade_duration=crossfade_duration, target_dBFS=target_volume ) if success: print(“音频合并成功!”) else: print(“音频合并失败,请检查错误信息”) 帮我格式化下
最新发布
10-30
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值