【每日算法】宝,你今天练算法了吗?

本文介绍了两种方法来判断一个字符串中的字符是否全都不重复:一是使用列表存储并比较长度,二是利用Python内置的set()函数。作者提供了isUnique函数的Python代码示例。
部署运行你感兴趣的模型镜像

题目:

实现一个算法,确定一个字符串 s 的所有字符是否全都不同(Python实现)

s = 'leetcode'
false

s = 'abc'
true

第一种解题思路:将不重复的元素放到列表中,判断列表长度和字符串长度

def isUnique(s):
    li = []
    for i in s:
        if i not in li:
            li.append(i)

    if len(li) != len(s):
        return False
    else:
        return True

第二种解题思路:将字符串用内置函数 set() 转换为集合,此时集合会自动排除重复项。

def isUnique(s):
    ns = set(s)
    if len(ns) != len(s):
        return False
    else:
        return True

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>好的,用户之前已经问过如何学习算法,现在他们想知道基础算法需要学多久。我需要先理解他们的具体需求。可能用户刚开始学习算法,想制定一个合理的时间计划,或者他们可能在进度中感到困惑,想知道需要投入多少时间才能掌握基础。 首先,用户提到的“基础算法”具体指哪些内容呢?通常包括数据结构、排序、查找、递归、动态规划、贪心算法等。每个人的学习速度和背景不同,所以时间会有差异。我需要考虑不同背景的学习者,比如学生、转行者或有经验的开发者,他们所需时间可能不同。 接下来,用户可能需要一个大致的时间范围,比如几周或几个月。但必须强调这取决于每天投入的时间和习的质量。比如,如果每天能投入3小时,系统学习可能需要2-3个月;如果时间较少,可能需要更长时间。同时,实践和理论结合的重要性也要提到,光看不是不够的。 另外,用户可能担心自己学得不够快,或者遇到困难时如何调整。所以需要给出分阶段的学习建议,比如先花时间在数据结构,再逐步进入算法思想,同时配合刷题巩固。还要提醒避免常见的误区,比如盲目刷题而不理解原理,或者死记硬背代码。 可能用户没有明确说明他们的现有水平,所以回答需要覆盖不同情况。比如零基础和有编程经验的人,学习时间不同。此外,推荐一些资源,如书籍、在线课程,帮助用户找到合适的学习材料。 最后,要鼓励用户坚持学习,强调算法学习是一个长期过程,基础阶段只是起点,持续习和复习是关键。可能需要提到时间管理的技巧,如每日刷题、定期复习,以及参与社区讨论来保持动力。</think>学习基础算法所需的时间因人而异,具体取决于**编程基础、学习效率和投入时间**。以下是不同背景学习者的参考时间范围和关键学习路径: --- ### 一、时间预估(每日投入1-3小时) | **学习者背景** | **预估时间** | **关键学习内容** | |-----------------------|--------------|--------------------------------------| | 零基础(无编程经验) | 4-6个月 | 编程语法→数据结构→基础算法思想 | | 有编程经验(熟悉语法) | 2-3个月 | 数据结构→算法分类→LeetCode简单题 | | 有算法竞赛目标 | 6-12个月 | 高阶算法+大量刷题(Codeforces/ACM) | --- ### 二、分阶段学习规划 #### 阶段1:数据结构入门(1-2周) - **核心内容** - 数组、链表、栈、队列的实现与应用(如用数组实现队列)。 - 哈希表(HashMap)的原理,解决冲突的方法(如拉链法)。 - 二叉树遍历(前序、中序、后序),递归与非递归写法。 - **实践目标** - 手写链表增删改查代码,实现二叉树层次遍历(BFS)。 #### 阶段2:基础算法思想(3-4周) 1. **排序与搜索** - 掌握快速排序(分治思想,平均时间复杂度 $O(n \log n)$)、二分查找(边界条件处理)。 2. **递归与回溯** - 理解递归终止条件,解决全排列、子集问题(如LeetCode #78子集)。 3. **动态规划(DP)入门** - 从斐波那契数列记忆化搜索过渡到递推公式,理解状态转移方程(如爬楼梯问题)。 #### 阶段3:巩固与拓展(4-6周) - **高频题型分类突破** - 双指针:两数之和、滑动窗口(如LeetCode #3无重复字符最长子串)。 - 贪心算法:区间调度问题(证明贪心策略的正确性)。 - 二叉树:路径总和、最近公共祖先(LCA)。 - **复杂度分析** - 能推导代码的时间复杂度(如嵌套循环→$O(n^2)$,递归+分治→$O(n \log n)$)。 --- ### 三、关键加速技巧 1. **刻意习法** - 同一类题型集中训(例如连续3天专攻动态规划)。 - 参考代码模板后,尝试独立复现(如DFS模板): ```python def dfs(node, path): if 终止条件: 记录结果 return for 选择 in 可选列表: if 剪枝条件: continue path.append(选择) dfs(下一层节点, path) path.pop() ``` 2. **错题复盘** - 记录典型错误(如边界条件错误、死循环),分析根本原因。 - 对比最优解与自己代码的时间复杂度差异(例如暴力解$O(n^2)$ vs 哈希表优化$O(n)$)。 --- ### 四、避免时间浪费的陷阱 1. **不要过早追求“最优解”** - 先写出暴力解法(如三重循环解三数之和),再逐步优化。 2. **拒绝无效刷题** - 如果1小时内无法独立解题,直接看答案并标注为“需复习”。 3. **警惕“表面理解”** - 能复现代码 ≠ 真正掌握(需能推导出动态规划的状态转移方程,例如背包问题的递推式: $$ dp[i][j] = \max(dp[i-1][j], dp[i-1][j-w_i] + v_i) $$ ) --- ### 五、检验学习成果的标准 - **基础达标**:能独立解决LeetCode简单题(80%通过率),中等题(50%通过率)。 - **进阶标志**: - 对常用算法能快速写出伪代码(如Dijkstra最短路径算法)。 - 能向他人清晰讲解回溯法的剪枝优化逻辑。 --- ### 六、长期学习建议 - 每周至少3道新题 + 2道旧题复习(防止遗忘)。 - 参与在线判题系统的周赛(如LeetCode Weekly Contest),检测实战能力。 通过合理规划,大多数人可在3个月内掌握基础算法,但**持续实践**才是巩固能力的关键。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值