程序员如何从八股文中学到真正的技术?

文章首发到公众号:月伴飞鱼,每天分享程序员职场经验!

大家好呀,我是飞鱼

在国内的面试环境下,相信很多人都有背八股文找工作的经历。

但大部分人看完后,其实很多可能没有完全理解八股文中包含的技术和知识。

仅仅可能是背下来,或者只有浮于表面的理解,如果面试官多问一层,又或者换个角度去问。

  • 我们往往就不知道该怎么回答了。

而且当我们应付掉面试,找到工作之后:

这些八股文知识点,很快就会忘记。

因为之前的这些内容,都是靠短期记忆的,并没有完全理解相关技术知识。

而且等到后面的工作中,一定会暴露出问题:

  • 比如写出技术BUG,或者遇到性能问题无法优化等。

所以我们得想办法把八股文中的技术学明白才行。

其实我们会发现,八股文中的每一条结论,其背后都会有复杂且丰富的问题场景。

  • 还有对应的问题思考解决过程。

这才是这些技术问题的真正价值所在。

如果只是单靠八股文,我们无法培养出工程师的思维和能力。

  • 工程师的价值在于解决问题,你能解决的问题越复杂,就越有价值。

所以,我们需要培养解决问题的能力。

最好的方式就是参与到问题的解决过程中,学习问题是如何被别人解决的。

然后模仿/借鉴这些问题解决的思路,运用到自己的应用实践中去。

总结一下:

我们要在八股文表面技术之上,弄清楚问题的来龙去脉,然后学习问题的解决思路,并有意识的运用起来。

反正就是:我们学习八股文,不在于学一个技术结论,而在于学习每个问题以及其产生结论的思考过程。

有啥其他看法,欢迎在评论区留言讨论。

想看技术文章的,可以去我的个人网站:hardyfish.top/

  • 目前网站的内容足够应付基础面试(P6)了!

每日一题

题目描述

给定一个字符串 s ,请你找出其中不含有重复字符的最长

示例 1:

ini 复制代码
输入: s = "abcabcbb"
输出: 3 

示例 2:

ini 复制代码
输入: s = "bbbbb"
输出: 1

示例 3:

ini 复制代码
输入: s = "pwwkew"
输出: 3

解题思路

给定一个字符串s ,请你找出其中不含有重复字符的 最长子串 的长度。

定义一个 map 数据结构存储,其中 key 值为字符,value 值为字符位置 +1,加 1 表示从字符位置后一个才开始不重复。

  • 定义不重复子串的开始位置为 start,结束位置为 end

随着 end 不断遍历向后,会遇到与 [start, end] 区间内字符相同的情况。

此时将字符作为 key 值,获取其 value 值。

  • 并更新 start,此时 [start, end] 区间内不存在重复字符。

代码实现

Java代码:

Java 复制代码
class Solution {
    public int lengthOfLongestSubstring(String s) {
        int n = s.length(), result = 0;
        Map<Character, Integer> map = new HashMap<>();
        for (int end = 0, start = 0; end < n; end++) {
            char c = s.charAt(end);
            if (map.containsKey(c)) {
                start = Math.max(map.get(c), start);
            }
            result = Math.max(result, end - start + 1);
            map.put(s.charAt(end), end + 1);
        }
        return result;
    }
}

Python代码:

Python 复制代码
class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        n = len(s)
        result = 0
        char_map = {}
        start = 0
        
        for end in range(n):
            c = s[end]
            if c in char_map:
                start = max(char_map[c], start)
            result = max(result, end - start + 1)
            char_map[c] = end + 1
        
        return result

Go代码:

Go 复制代码
func lengthOfLongestSubstring(s string) int {
 n := len(s)
 result := 0
 charMap := make(map[rune]int)
 start := 0

 for end, c := range s {
  if index, found := charMap[c]; found {
   start = max(index, start)
  }
  result = max(result, end-start+1)
  charMap[c] = end + 1
 }

 return result
}

func max(a, b int) int {
 if a > b {
  return a
 }
 return b
}

复杂度分析:

时间复杂度 O(N)

  • 其中 N 为字符串长度。

空间复杂度 O(1)

相关推荐
AskHarries35 分钟前
OpenClaw 如何查看历史对话和响应时间?
后端
n8n36 分钟前
Spring Boot 3.2+ 新特性、Spring AI 核心架构与 API Key 安全管理技术文档
后端
古法安卓37 分钟前
Android-epoll原理详解
android·java·android studio
fireworks9940 分钟前
接口鉴权(401与403)
java·后端
wear工程师1 小时前
线程池里的异常去哪了?execute 和 submit 不是一回事
java
n8n1 小时前
Java 21 虚拟线程(Virtual Threads)
后端
孔明click331 小时前
别人绕过我的网关直接调用资源服务怎么办?使用 Sa-Token 解决:网关转发鉴权、RPC调用鉴权
java·sa-token·springboot·权限·权限认证
吴声子夜歌1 小时前
Java面试——设计模式(一)
java·设计模式·面试
Csvn1 小时前
🐍 Day 5: Python 函数详解 — 参数、作用域与一等公民
人工智能·后端
半亩码田1 小时前
C#转Python第3.6篇:Python 的 @property 比 C# 的 get/set 更灵活
java·python·c#