<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Blog</title>
    <link>https://marvel-l.github.io/Blog/</link>
    <description>Marvel-L 的技术分享和生活随笔</description>
    <language>zh-CN</language>
    <lastBuildDate>Sun, 04 Oct 2026 00:00:00 GMT</lastBuildDate>
    <atom:link href="https://marvel-l.github.io/Blog/feed.xml" rel="self" type="application/rss+xml" />
    <item>
      <title><![CDATA[算法打卡冲刺 week2 day1]]></title>
      <link>https://marvel-l.github.io/Blog/post/xiaolin_algo_week2_day1</link>
      <guid isPermaLink="true">https://marvel-l.github.io/Blog/post/xiaolin_algo_week2_day1</guid>
      <description><![CDATA[我能复刻的路吗]]></description>
      <content:encoded><![CDATA[<article><h1>459.重复的子字符串</h1>
<p>力扣链接： <a href="https://leetcode.cn/problems/repeated-substring-pattern/" target="_blank" rel="noopener noreferrer">https://leetcode.cn/problems/repeated-substring-pattern/</a></p>
<p>题目：给你一个字符串 s，判断它是否能由某个子串重复多次（至少两次）构成。例如 <code>abab</code> 是 <code>ab</code> 重复两次，<code>aba</code> 则不行。</p>
<h2>思路</h2>
<p>核心结论：</p>
<p><mark><code>s</code> 是重复子串构成 ⟺ <code>s</code> 会出现在 <code>(s+s)</code> 去掉首尾各一个字符后的串里</mark></p>
<p>为什么要掐头去尾：<code>s+s</code> 里一定能在「中间拼缝」找到整段 <code>s</code>（第二个 <code>s</code> 的开头），这不能说明有重复模式。去掉首尾后，合法起点只剩 <code>1 .. n-1</code>，这时还能找到完整的 <code>s</code>，才说明存在周期。</p>
<p>等价写法：</p>
<pre><code class="hljs language-go">ss := s[<span class="hljs-number">1</span>:] + s[:<span class="hljs-built_in">len</span>(s)<span class="hljs-number">-1</span>]   <span class="hljs-comment">// 就是 (s+s)[1 : 2n-1]</span>
strings.Contains(ss, s)
</code></pre>
<h3>小例子</h3>
<p><code>s = "abab"</code>，<code>n = 4</code></p>
<ul>
<li><code>s[1:]</code> → <code>"bab"</code></li>
<li><code>s[:3]</code> → <code>"aba"</code></li>
<li><code>ss = "bababa"</code>，包含 <code>"abab"</code> → true</li>
</ul>
<p><code>s = "aba"</code>，<code>n = 3</code></p>
<ul>
<li><code>ss = "ba" + "ab" = "baab"</code>，不包含 <code>"aba"</code> → false</li>
</ul>
<h2>问题：切片为什么是 <code>len(str)-1</code></h2>
<p>一开始会想：是不是因为「左开右闭」才写成 <code>len(str)-1</code>？</p>
<p>其实 Go / 多数语言切片是 <mark>左闭右开</mark>：</p>
<pre><code class="hljs language-text">s[a:b]  ⟺  a ≤ i &#x3C; b
</code></pre>
<p>所以：</p>
<table>
<thead>
<tr>
<th>写法</th>
<th>实际下标</th>
<th>效果</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>s[1:]</code></td>
<td><code>[1, n)</code></td>
<td>去掉<strong>第一个</strong>字符</td>
</tr>
<tr>
<td><code>s[:n-1]</code></td>
<td><code>[0, n-1)</code> → <code>0..n-2</code></td>
<td>去掉<strong>最后一个</strong>字符</td>
</tr>
</tbody>
</table>
<p><mark><code>end</code> 写成 <code>n-1</code>，正是因为右端点不包含；想排除下标 <code>n-1</code>，就要把开区间右端停在 <code>n-1</code></mark></p>
<h2>Code</h2>
<p>少一次 <code>[]byte</code> 来回转换，直接切片即可：</p>
<pre><code class="hljs language-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">repeatedSubstringPattern</span><span class="hljs-params">(s <span class="hljs-type">string</span>)</span></span> <span class="hljs-type">bool</span> {
	n := <span class="hljs-built_in">len</span>(s)
	<span class="hljs-keyword">if</span> n == <span class="hljs-number">0</span> {
		<span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>
	}
	<span class="hljs-keyword">return</span> strings.Contains((s + s)[<span class="hljs-number">1</span>:<span class="hljs-number">2</span>*n<span class="hljs-number">-1</span>], s)
}
</code></pre>
<p>也可以写成掐头去尾再拼：</p>
<pre><code class="hljs language-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">repeatedSubstringPattern</span><span class="hljs-params">(s <span class="hljs-type">string</span>)</span></span> <span class="hljs-type">bool</span> {
	str := []<span class="hljs-type">byte</span>(s)
	ss := <span class="hljs-type">string</span>(str[<span class="hljs-number">1</span>:]) + <span class="hljs-type">string</span>(str[:<span class="hljs-built_in">len</span>(str)<span class="hljs-number">-1</span>])
	<span class="hljs-keyword">return</span> strings.Contains(ss, s)
}
</code></pre>
<p>第二种多了 <code>[]byte</code> / <code>string(...)</code> 分配，逻辑一样，常数更差一点。</p>
<h2>问题：Contains 和手写暴力性能为什么不一样</h2>
<p>搜索范围其实一样。手写版等价于在 <code>dummy = s+s</code> 上从 <code>i = 1</code> 扫到 <code>i &#x3C; n</code>：</p>
<pre><code class="hljs language-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">repeatedSubstringPattern</span><span class="hljs-params">(s <span class="hljs-type">string</span>)</span></span> <span class="hljs-type">bool</span> {
	dummy := s + s

	<span class="hljs-keyword">for</span> i := <span class="hljs-number">1</span>; i &#x3C; <span class="hljs-built_in">len</span>(dummy)-<span class="hljs-built_in">len</span>(s); i++ {
		isEqual := <span class="hljs-literal">true</span>
		<span class="hljs-keyword">for</span> j := <span class="hljs-number">0</span>; j &#x3C; <span class="hljs-built_in">len</span>(s); j++ {
			<span class="hljs-keyword">if</span> dummy[i+j] != s[j] {
				isEqual = <span class="hljs-literal">false</span>
				<span class="hljs-keyword">break</span>
			}
		}
		<span class="hljs-keyword">if</span> isEqual {
			<span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>
		}
	}
	<span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>
}
</code></pre>
<h3>时间复杂度怎么记</h3>
<table>
<thead>
<tr>
<th>写法</th>
<th>常见 / 实践</th>
<th>最坏</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>strings.Contains</code></td>
<td><strong>可认为 O(n)</strong>（相对 <code>|s|</code>）</td>
<td>标准库用特化 / Rabin-Karp / Two-Way，目标避开朴素平方</td>
</tr>
<tr>
<td>手写双重循环</td>
<td>首字符常对不上，<code>break</code> 后接近 <strong>O(n)</strong>（感觉像几个 n、甚至 ≈2n）</td>
<td>外层约 n、内层最多 n → <strong>O(n²)</strong></td>
</tr>
</tbody>
</table>
<p>容易踩的坑：</p>
<ol>
<li>觉得暴力「应该是 2n」——那是 <mark>早退时的实际比较次数</mark>，不是最坏复杂度。</li>
<li><code>dummy</code> 长度是 <code>2n</code>，只说明串长，<mark>不等于比较次数是 2n</mark>。</li>
<li>benchmark 里两者有时都像线性，差在常数；难匹配输入上暴力才可能突然变慢。</li>
</ol>
<h2>一句话收束</h2>
<ul>
<li>判定：<code>(s+s)</code> 掐头去尾后是否 <code>Contains(s)</code></li>
<li>切片：<mark>左闭右开</mark>，所以去尾写 <code>[:n-1]</code></li>
<li>复杂度：<code>Contains</code> 按 <strong>O(n)</strong> 记；暴力最坏 <strong>O(n²)</strong>，常见因早退接近 O(n)</li>
</ul></article>]]></content:encoded>
      <pubDate>Sun, 04 Oct 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-10-04T00:00:00.000Z</atom:updated>
      <category domain="category">算法</category>
      <category domain="tag">日常</category>
      <category domain="tag">我的来时路</category>
      <author>Marvel-L</author>
    </item>
    <item>
      <title><![CDATA[Golang For 循环语法错误]]></title>
      <link>https://marvel-l.github.io/Blog/post/for-gamma-error-0x01</link>
      <guid isPermaLink="true">https://marvel-l.github.io/Blog/post/for-gamma-error-0x01</guid>
      <description><![CDATA[一次踩坑总结出来的经验]]></description>
      <content:encoded><![CDATA[<article><h1>写在前面</h1>
<p>做题的时候, 使用 For 写出了一个很诡异的代码</p>
<p><img src="https://marvel-l.github.io/Blog/example.png" alt="example.png"></p>
<h1>问题总结</h1>
<h2>For 第一层声明</h2>
<p>对于声明区间 只能选择声明一次 。</p>
<p>对于</p>
<pre><code class="hljs language-go"><span class="hljs-keyword">for</span> j := i ,cursor := <span class="hljs-number">1</span> ; j &#x3C; n - i ; j ++ , cusror ++ {
</code></pre>
<p>这种写法应该优化成</p>
<pre><code class="hljs language-go"><span class="hljs-keyword">for</span> j, cursor := i, <span class="hljs-number">1</span> ; j &#x3C; i + k; j ++ , cursor ++ 
</code></pre>
<h2>For 第三层自增</h2>
<p>对于这种写法， <code>Cursor</code>处会报错 是因为 Golang 中 <mark>没有逗号运算符</mark></p>
<p>如果想要处理的话 同样需要改成 j, cursor = j+1, cursor+1</p>
<pre><code class="hljs language-go"><span class="hljs-keyword">for</span> j, cursor := i, <span class="hljs-number">1</span> ; j &#x3C; i + k; j ++ , cursor ++ 
</code></pre>
<h2>String 不可改</h2>
<p>对于 String 类型，默认是只读的 并不可以更改， 要将字符串变成 <code>[]byte</code> 之后才可以进行读写操作</p>
<p><img src="https://marvel-l.github.io/Blog/string-not-change.png" alt="string-not-change.png"></p></article>]]></content:encoded>
      <pubDate>Sat, 03 Oct 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-10-03T00:00:00.000Z</atom:updated>
      <category domain="category">Golang</category>
      <category domain="tag">Go</category>
      <category domain="tag">循环</category>
      <category domain="tag">语法错误</category>
      <author>Marvel-L</author>
    </item>
    <item>
      <title><![CDATA[算法打卡冲刺 day5]]></title>
      <link>https://marvel-l.github.io/Blog/post/xiaolin_algo_week1_day5</link>
      <guid isPermaLink="true">https://marvel-l.github.io/Blog/post/xiaolin_algo_week1_day5</guid>
      <description><![CDATA[我能复刻的路吗]]></description>
      <content:encoded><![CDATA[<article><h1>344.反转字符串</h1>
<p>力扣链接：<a href="https://leetcode.cn/problems/reverse-string/" target="_blank" rel="noopener noreferrer">https://leetcode.cn/problems/reverse-string/</a></p>
<p>题目：给你一个字符串，字符串存在数组里面，翻转字符串，不能用额外空间</p>
<h2>思路</h2>
<p>题目要求很简单</p>
<ol>
<li><mark>不能使用额外空间</mark></li>
<li><mark>反转字符串</mark></li>
</ol>
<p>因此我们直接进行首尾交换即可</p>
<h2>Code</h2>
<pre><code class="hljs language-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">reverseString</span><span class="hljs-params">(s []<span class="hljs-type">byte</span>)</span></span>  {
    <span class="hljs-keyword">for</span> i :=<span class="hljs-number">0</span> ; i &#x3C; <span class="hljs-built_in">len</span>(s) / <span class="hljs-number">2</span> ; i ++ {
        s[i] , s[<span class="hljs-built_in">len</span>(s) - i - <span class="hljs-number">1</span>] = s[<span class="hljs-built_in">len</span>(s) - i - <span class="hljs-number">1</span>] , s[i]
    }
}
</code></pre>
<h1>541. 反转字符串II</h1>
<p>力扣链接：<a href="https://leetcode.cn/problems/reverse-string-ii/" target="_blank" rel="noopener noreferrer">https://leetcode.cn/problems/reverse-string-ii/</a></p>
<p>题目：给你一个字符串和k，每到2k个字符，就翻转前k个字符。如果剩余字符少于k个则全部翻转，如果小于2k但大于等于k，则翻转前k个</p>
<h2>思路</h2>
<p>根据题意进行模拟即可</p>
<ol>
<li>
<p>每次走 <code>2*k</code> 个步长</p>
</li>
<li>
<p>使用 l,r 进行区间交换 。 如果当前区间的 右区间 > n 那么缩小区间到可交换的地方即可</p>
</li>
</ol>
<pre><code class="hljs language-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">reverseStr</span><span class="hljs-params">(s <span class="hljs-type">string</span>, k <span class="hljs-type">int</span>)</span></span> <span class="hljs-type">string</span> {
	b := []<span class="hljs-type">byte</span>(s)
	n := <span class="hljs-built_in">len</span>(b)
	<span class="hljs-keyword">for</span> i := <span class="hljs-number">0</span>; i &#x3C; n; i += <span class="hljs-number">2</span> * k {
		l, r := i, i+k<span class="hljs-number">-1</span>
		<span class="hljs-keyword">if</span> r >= n {
			r = n - <span class="hljs-number">1</span>
		}
		<span class="hljs-keyword">for</span> l &#x3C; r {
			b[l], b[r] = b[r], b[l]
			l++
			r--
		}
	}
	<span class="hljs-keyword">return</span> <span class="hljs-type">string</span>(b)
}
</code></pre>
<h1>2.   541. 反转字符串II</h1>
<p>力扣链接：<a href="https://leetcode.cn/problems/reverse-string-ii/" target="_blank" rel="noopener noreferrer">https://leetcode.cn/problems/reverse-string-ii/</a></p>
<p>题目：给你一个字符串和k，每到2k个字符，就翻转前k个字符。如果剩余字符少于k个则全部翻转，如果小于2k但大于等于k，则翻转前k个</p>
<h2>思路</h2>
<p>很无聊的一个题，使用 <code>strings.ReplaceAll</code> 即可</p>
<h2>Code</h2>
<pre><code class="hljs language-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">pathEncryption</span><span class="hljs-params">(path <span class="hljs-type">string</span>)</span></span> <span class="hljs-type">string</span> {
    <span class="hljs-keyword">return</span> strings.ReplaceAll(path, <span class="hljs-string">"."</span>, <span class="hljs-string">" "</span>)
}
</code></pre>
<h2>剑指Offer58-II.左旋转字符串</h2>
<p>力扣链接： <a href="https://leetcode.cn/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/" target="_blank" rel="noopener noreferrer">https://leetcode.cn/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/</a></p>
<p>题目：给你一个字符串和一个k，把字符串前k个字符截取放到字符串末尾。abcd 2.-----cdab</p>
<h2>思路</h2>
<ol>
<li>
<p>我这里引用了 <mark>额外的空间</mark> 来进行解决</p>
</li>
<li>
<p>另外一种思路 是直接进行切片操作</p>
</li>
</ol>
<h2>Code</h2>
<pre><code class="hljs language-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">dynamicPassword</span><span class="hljs-params">(password <span class="hljs-type">string</span>, target <span class="hljs-type">int</span>)</span></span> <span class="hljs-type">string</span> {
    dummy := <span class="hljs-built_in">make</span>([]<span class="hljs-type">byte</span>, <span class="hljs-number">0</span> , <span class="hljs-built_in">len</span>(password))
    <span class="hljs-keyword">for</span> i := target ; i &#x3C; <span class="hljs-built_in">len</span>(password) ; i ++  {
        dummy = <span class="hljs-built_in">append</span>(dummy, password[i])
    }

    <span class="hljs-keyword">for</span> i := <span class="hljs-number">0</span> ; i &#x3C; target ; i ++ {
        dummy = <span class="hljs-built_in">append</span>(dummy, password[i])
    }
    <span class="hljs-keyword">return</span> <span class="hljs-type">string</span>(dummy)
}
</code></pre>
<pre><code class="hljs language-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">reverseLeftWords</span><span class="hljs-params">(s <span class="hljs-type">string</span>, n <span class="hljs-type">int</span>)</span></span> <span class="hljs-type">string</span> {
    <span class="hljs-keyword">return</span> s[n:]+s[:n]
}
</code></pre></article>]]></content:encoded>
      <pubDate>Sat, 03 Oct 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-10-03T00:00:00.000Z</atom:updated>
      <category domain="category">算法</category>
      <category domain="tag">日常</category>
      <category domain="tag">我的来时路</category>
      <author>Marvel-L</author>
    </item>
    <item>
      <title><![CDATA[算法打卡冲刺 day4]]></title>
      <link>https://marvel-l.github.io/Blog/post/xiaolin_algo_week1_day4</link>
      <guid isPermaLink="true">https://marvel-l.github.io/Blog/post/xiaolin_algo_week1_day4</guid>
      <description><![CDATA[我能复刻的路吗]]></description>
      <content:encoded><![CDATA[<article><h1>两数之和</h1>
<p>力扣链接 : <a href="https://leetcode.cn/problems/two-sum/description/" target="_blank" rel="noopener noreferrer">https://leetcode.cn/problems/two-sum/description/</a></p>
<p>题目 : 给定一个数组 和 Target, 询问数组里面哪两个元素之和等于 target, 如果等于则返回下标</p>
<h2>思路</h2>
<p>顺序遍历数组, 把元素存入到 Map 中 。每次访问的时候 判断 Map 中是否存在对应的 Target - cur 的 Key</p>
<p>如果存在则说明出现过</p>
<h2>Code</h2>
<pre><code class="hljs language-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">twoSum</span><span class="hljs-params">(nums []<span class="hljs-type">int</span>, target <span class="hljs-type">int</span>)</span></span> []<span class="hljs-type">int</span> {
    mp := <span class="hljs-built_in">make</span>(<span class="hljs-keyword">map</span>[<span class="hljs-type">int</span>]<span class="hljs-type">int</span>)
    res := <span class="hljs-built_in">make</span>([]<span class="hljs-type">int</span>, <span class="hljs-number">0</span>, <span class="hljs-built_in">len</span>(nums))

    <span class="hljs-keyword">for</span> i , v := <span class="hljs-keyword">range</span> nums {
        <span class="hljs-keyword">if</span> mp[target - v] != <span class="hljs-number">0</span> {
            res = <span class="hljs-built_in">append</span>(res, mp[target - v] - <span class="hljs-number">1</span>, i)
        }
        mp[v] = i + <span class="hljs-number">1</span>
    }
    <span class="hljs-keyword">return</span> res 
}
</code></pre>
<h1>454 四数相加</h1>
<p>力扣链接 : <a href="https://leetcode.cn/problems/4sum-ii/description/" target="_blank" rel="noopener noreferrer">https://leetcode.cn/problems/4sum-ii/description/</a></p>
<p>题目 : 给你四个整数数组 nums1、nums2、nums3 和 nums4 ，数组长度都是 n ，请你计算有多少个元组 (i, j, k, l) 能满足：</p>
<ul>
<li>0 &#x3C;= i, j, k, l &#x3C; n</li>
<li>nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0</li>
</ul>
<h2>思路</h2>
<ol>
<li>
<p>一开始没什么思路， 直接暴力的做法 是  200^4 = 1e8 的 肯定会超时</p>
</li>
<li>
<p>考虑使用两数之和的思路来优化， 前两个数组相加 和 后两个数组相加 然后跑一边两数之和</p>
<ul>
<li>这里会遇到 <mark>多计算</mark> 多情况, 因为最后我们跑循环的时候，会额外计算一部分 一半数组的情况</li>
</ul>
</li>
<li>
<p>因此考虑优化，我们维护两个 Map, <mark>在处理计算的时候 我们就统计对应的 和数量</mark></p>
</li>
<li>
<p>最后在 Match 的时候就是一个 乘法交换 的过程</p>
</li>
</ol>
<h2>历程</h2>
<pre><code class="hljs language-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">fourSumCount</span><span class="hljs-params">(nums1 []<span class="hljs-type">int</span>, nums2 []<span class="hljs-type">int</span>, nums3 []<span class="hljs-type">int</span>, nums4 []<span class="hljs-type">int</span>)</span></span> <span class="hljs-type">int</span> {

    m1 := <span class="hljs-built_in">make</span>([]<span class="hljs-type">int</span>, <span class="hljs-number">0</span>, <span class="hljs-built_in">len</span>(nums1) * <span class="hljs-built_in">len</span>(nums2) + <span class="hljs-built_in">len</span>(nums3) * <span class="hljs-built_in">len</span>(nums4))
    <span class="hljs-keyword">for</span> _ ,v1 := <span class="hljs-keyword">range</span> nums1 {
        <span class="hljs-keyword">for</span> _, v2 := <span class="hljs-keyword">range</span> nums2 {
            m1 = <span class="hljs-built_in">append</span>(m1, v1 + v2)
        } 
    }
    
    <span class="hljs-keyword">for</span> _ ,v1 := <span class="hljs-keyword">range</span> nums3 {
        <span class="hljs-keyword">for</span> _, v2 := <span class="hljs-keyword">range</span> nums4 {
            m1 = <span class="hljs-built_in">append</span>(m1, v1 + v2)
        } 
    }
    

    mp := <span class="hljs-built_in">make</span>(<span class="hljs-keyword">map</span>[<span class="hljs-type">int</span>]<span class="hljs-type">int</span>)
    cnt := <span class="hljs-number">0</span> 
    <span class="hljs-keyword">for</span> _ ,v := <span class="hljs-keyword">range</span> m1 {
        <span class="hljs-keyword">if</span> v, ok := mp[-v] ; ok {
            cnt += v
        }
        mp[v] ++
    }
    <span class="hljs-keyword">return</span> cnt 
}
</code></pre>
<h2>Code</h2>
<pre><code class="hljs language-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">fourSumCount</span><span class="hljs-params">(nums1 []<span class="hljs-type">int</span>, nums2 []<span class="hljs-type">int</span>, nums3 []<span class="hljs-type">int</span>, nums4 []<span class="hljs-type">int</span>)</span></span> <span class="hljs-type">int</span> {

    m1 := <span class="hljs-built_in">make</span>(<span class="hljs-keyword">map</span>[<span class="hljs-type">int</span>]<span class="hljs-type">int</span>)
    m2 := <span class="hljs-built_in">make</span>(<span class="hljs-keyword">map</span>[<span class="hljs-type">int</span>]<span class="hljs-type">int</span>)
    <span class="hljs-keyword">for</span> _ ,v1 := <span class="hljs-keyword">range</span> nums1 {
        <span class="hljs-keyword">for</span> _, v2 := <span class="hljs-keyword">range</span> nums2 {
            m1[v1 + v2] ++ 
        } 
    }
    
    <span class="hljs-keyword">for</span> _ ,v1 := <span class="hljs-keyword">range</span> nums3 {
        <span class="hljs-keyword">for</span> _, v2 := <span class="hljs-keyword">range</span> nums4 {
            m2[v1 + v2] ++ 
        } 
    }
    
    cnt := <span class="hljs-number">0</span> 

    <span class="hljs-keyword">for</span> k, v := <span class="hljs-keyword">range</span> m1 {
        <span class="hljs-keyword">if</span> _ , ok := m2[-k] ; ok {
            cnt += v * m2[-k]
        }
    }
    <span class="hljs-keyword">return</span> cnt 
}
</code></pre>
<h1>383.赎金信</h1>
<p>力扣链接 : <a href="https://leetcode.cn/problems/ransom-note/description/" target="_blank" rel="noopener noreferrer">https://leetcode.cn/problems/ransom-note/description/</a></p>
<p>题目 : 给你两个字符串 ransomNote 和 magazine ，如果 ransomNote 能由 magazine 里面的字符构成，则返回 true ；否则返回 false 。</p>
<h2>思路</h2>
<p>这个和之前做过的的 字符串匹配 不是很像 。 因为这个允许 <mark>不规则数量匹配</mark></p>
<p>无非是代码上需要额外处理一下</p>
<h2>Code</h2>
<pre><code class="hljs language-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">canConstruct</span><span class="hljs-params">(ransomNote <span class="hljs-type">string</span>, magazine <span class="hljs-type">string</span>)</span></span> <span class="hljs-type">bool</span> {
    st := <span class="hljs-built_in">make</span>(<span class="hljs-keyword">map</span>[<span class="hljs-type">rune</span>]<span class="hljs-type">int</span>)
    <span class="hljs-keyword">for</span> _ ,  v := <span class="hljs-keyword">range</span> magazine {
        st[v - <span class="hljs-string">'a'</span>] ++ 
    }

    <span class="hljs-keyword">for</span> _, v := <span class="hljs-keyword">range</span> ransomNote {
        <span class="hljs-keyword">if</span> _ , ok := st[v - <span class="hljs-string">'a'</span>] ; ok {
            st[v - <span class="hljs-string">'a'</span>]  -- 
        }
    }

    <span class="hljs-keyword">for</span> _, v := <span class="hljs-keyword">range</span> ransomNote {
        <span class="hljs-keyword">if</span> _, ok := st[v - <span class="hljs-string">'a'</span>] ; !ok {
            <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span> 
        }
        <span class="hljs-keyword">if</span> st[v - <span class="hljs-string">'a'</span>] &#x3C; <span class="hljs-number">0</span> {
            <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span> 
        }
    }
    <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span> 
}
</code></pre>
<h1>15.三数之和</h1>
<p>题目链接 : <a href="https://leetcode.cn/problems/3sum/description/" target="_blank" rel="noopener noreferrer">https://leetcode.cn/problems/3sum/description/</a></p>
<p>给你一个整数数组 nums ，判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ，同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。</p>
<p>注意：答案中不可以包含重复的三元组。</p>
<h2>思路</h2>
<ol>
<li>
<p>考虑枚举 i , <mark>那么题目就变成了 nums[j] + nums[k]  = nums[i]</mark> , 即两数之和的版本</p>
</li>
<li>
<p>因为我们题目给出的数组是无序的，所以我们可以考虑排序优化一下，这样子对于</p>
<ul>
<li>nums[i] + nums[k1] + nums[k2] > 0 或者 nums[i] + nums[k1] + nums[k2] &#x3C; 0 的时候可以更好的进行移动</li>
</ul>
</li>
</ol>
<h2>Code</h2>
<pre><code class="hljs language-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">threeSum</span><span class="hljs-params">(nums []<span class="hljs-type">int</span>)</span></span> [][]<span class="hljs-type">int</span> {
    slices.Sort(nums)
    n := <span class="hljs-built_in">len</span>(nums)
    ans := <span class="hljs-built_in">make</span>([][]<span class="hljs-type">int</span>,<span class="hljs-number">0</span>)
    <span class="hljs-keyword">for</span> i := <span class="hljs-number">0</span> ; i &#x3C;  <span class="hljs-built_in">len</span>(nums) - <span class="hljs-number">2</span> ; i ++ {
        x := nums[i]
        <span class="hljs-keyword">if</span> i > <span class="hljs-number">0</span> &#x26;&#x26; x == nums[i<span class="hljs-number">-1</span>] {
            <span class="hljs-keyword">continue</span> 
        }
        <span class="hljs-keyword">if</span> x + nums[i + <span class="hljs-number">1</span>] + nums[i+<span class="hljs-number">2</span>] > <span class="hljs-number">0</span> {
            <span class="hljs-keyword">break</span> 
        }
        <span class="hljs-keyword">if</span> x + nums[n - <span class="hljs-number">2</span>] + nums[n - <span class="hljs-number">1</span>] &#x3C; <span class="hljs-number">0</span> {
            <span class="hljs-keyword">continue</span> 
        }

        l , r := i + <span class="hljs-number">1</span>, n - <span class="hljs-number">1</span>
        <span class="hljs-keyword">for</span> l &#x3C; r {
            s := x + nums[l] + nums[r]
            <span class="hljs-keyword">if</span> s > <span class="hljs-number">0</span> {
                r -- 
            }<span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> s &#x3C; <span class="hljs-number">0</span> {
                l ++ 
            }<span class="hljs-keyword">else</span> {
                ans = <span class="hljs-built_in">append</span>(ans, []<span class="hljs-type">int</span>{x,nums[l],nums[r]})
                <span class="hljs-keyword">for</span> l ++ ; l &#x3C; r &#x26;&#x26; nums[l] == nums[l<span class="hljs-number">-1</span>] ; l ++ {} 
                <span class="hljs-keyword">for</span> r -- ; l &#x3C; r &#x26;&#x26; nums[r] == nums[r+<span class="hljs-number">1</span>] ; r -- {}
            }
        }
    }
    <span class="hljs-keyword">return</span> ans 
}
</code></pre>
<h1>18. 四数之和</h1>
<p>题目链接 : <a href="https://leetcode.cn/problems/4sum/description/" target="_blank" rel="noopener noreferrer">https://leetcode.cn/problems/4sum/description/</a></p>
<p>给你一个由 n 个整数组成的数组 nums ，和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] （若两个四元组元素一一对应，则认为两个四元组重复）：</p>
<p>0 &#x3C;= a, b, c, d &#x3C; n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。</p>
<h2>思路</h2>
<ol>
<li>根据三数之和的步骤， 我们可以尝试<mark>固定 a,b</mark> 那么就变成了 <code>c + d = target - a - b</code> 即是我们的两数之和模板</li>
<li>那么就是去重的问题，无非就是 Continue 一下相等的数据</li>
</ol>
<h2>Code</h2>
<pre><code class="hljs language-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">fourSum</span><span class="hljs-params">(nums []<span class="hljs-type">int</span>, target <span class="hljs-type">int</span>)</span></span> [][]<span class="hljs-type">int</span> {
    res := <span class="hljs-built_in">make</span>([][]<span class="hljs-type">int</span>, <span class="hljs-number">0</span>)
    n := <span class="hljs-built_in">len</span>(nums)
    <span class="hljs-keyword">if</span> n &#x3C; <span class="hljs-number">4</span> {
        <span class="hljs-keyword">return</span> res
    }

    slices.Sort(nums)

    <span class="hljs-keyword">for</span> i := <span class="hljs-number">0</span>; i &#x3C; n<span class="hljs-number">-3</span>; i++ {
        <span class="hljs-keyword">if</span> i > <span class="hljs-number">0</span> &#x26;&#x26; nums[i] == nums[i<span class="hljs-number">-1</span>] {
            <span class="hljs-keyword">continue</span>
        }

        <span class="hljs-keyword">for</span> j := i + <span class="hljs-number">1</span>; j &#x3C; n<span class="hljs-number">-2</span>; j++ {
            <span class="hljs-keyword">if</span> j > i+<span class="hljs-number">1</span> &#x26;&#x26; nums[j] == nums[j<span class="hljs-number">-1</span>] {
                <span class="hljs-keyword">continue</span>
            }

            l, r := j+<span class="hljs-number">1</span>, n<span class="hljs-number">-1</span>
            <span class="hljs-keyword">for</span> l &#x3C; r {
                sum := nums[i] + nums[j] + nums[l] + nums[r]
                <span class="hljs-keyword">if</span> sum &#x3C; target {
                    l++
                } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> sum > target {
                    r--
                } <span class="hljs-keyword">else</span> {
                    res = <span class="hljs-built_in">append</span>(res, []<span class="hljs-type">int</span>{nums[i], nums[j], nums[l], nums[r]})
                    l++
                    r--

                    <span class="hljs-keyword">for</span> l &#x3C; r &#x26;&#x26; nums[l] == nums[l<span class="hljs-number">-1</span>] {
                        l++
                    }
                    <span class="hljs-keyword">for</span> l &#x3C; r &#x26;&#x26; nums[r] == nums[r+<span class="hljs-number">1</span>] {
                        r--
                    }
                }
            }
        }
    }

    <span class="hljs-keyword">return</span> res
}
</code></pre></article>]]></content:encoded>
      <pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-09-30T00:00:00.000Z</atom:updated>
      <category domain="category">算法</category>
      <category domain="tag">日常</category>
      <category domain="tag">我的来时路</category>
      <author>Marvel-L</author>
    </item>
    <item>
      <title><![CDATA[算法打卡冲刺 day3]]></title>
      <link>https://marvel-l.github.io/Blog/post/xiaolin_algo_week1_day3</link>
      <guid isPermaLink="true">https://marvel-l.github.io/Blog/post/xiaolin_algo_week1_day3</guid>
      <description><![CDATA[我能复刻的路吗]]></description>
      <content:encoded><![CDATA[<article><h1>02.07 链表相交</h1>
<p><strong>力扣链接</strong>: <a href="https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/" target="_blank" rel="noopener noreferrer">https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/</a></p>
<p><strong>题目</strong>: 给你两个链表，让你返回两个链表的交点，如果相交则输出，否则返回 Nil</p>
<h2>过程</h2>
<p>一开始以为是个暴力的做法</p>
<p>我们遍历链表 A，对于每个节点都额外走一遍链表 B. 当我们 Value 相等的时候 我们额外判断一下 两个节点的 Next 是否相等</p>
<p>如果相等则说明相交</p>
<p>这个思路有很大的问题</p>
<ol>
<li>整个时间复杂度过高</li>
<li><mark>代码很复杂 ，这个 dummy 我还是根据习惯写出来的</mark></li>
</ol>
<pre><code class="hljs language-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">getIntersectionNode</span><span class="hljs-params">(headA, headB *ListNode)</span></span> *ListNode {
    
    dummyA := &#x26;ListNode{Next: headA}
    dummyB := &#x26;ListNode{Next: headB}

    prevA := dummyA 
    <span class="hljs-keyword">for</span> prevA != <span class="hljs-literal">nil</span> {
        <span class="hljs-keyword">if</span> prevA.Next == <span class="hljs-literal">nil</span> {
            <span class="hljs-keyword">break</span> 
        }
        prevB := dummyB
        <span class="hljs-keyword">for</span> prevB != <span class="hljs-literal">nil</span> {
            <span class="hljs-keyword">if</span> prevA.Next != prevB.Next{  <span class="hljs-comment">// 当前节点相等</span>
                prevB = prevB.Next
                <span class="hljs-keyword">continue</span> 
            }
            <span class="hljs-keyword">if</span> prevA.Next.Next == prevB.Next.Next {
                <span class="hljs-keyword">return</span> prevA.Next.Next
            }
            prevB = prevB.Next
        }
    
        prevA = prevA.Next 
    }
    <span class="hljs-keyword">return</span> <span class="hljs-literal">nil</span> 
}
</code></pre>
<h2>正确思路</h2>
<p>我们考虑 PA 和 PB 两个指针， 当我们 PA 遍历完成之后尝试 从 headB 进行遍历</p>
<p>保证两个指针都走 M+N 个步长, 那么如果他们相交的话，就一定会存在相等的情况</p>
<pre><code class="hljs language-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">getIntersectionNode</span><span class="hljs-params">(headA, headB *ListNode)</span></span> *ListNode {
    <span class="hljs-keyword">if</span> headA == <span class="hljs-literal">nil</span> || headB == <span class="hljs-literal">nil</span> {
        <span class="hljs-keyword">return</span> <span class="hljs-literal">nil</span>
    }

    pA, pB := headA, headB
    <span class="hljs-keyword">for</span> pA != pB {
        <span class="hljs-keyword">if</span> pA == <span class="hljs-literal">nil</span> {
            pA = headB
        } <span class="hljs-keyword">else</span> {
            pA = pA.Next
        }

        <span class="hljs-keyword">if</span> pB == <span class="hljs-literal">nil</span> {
            pB = headA
        } <span class="hljs-keyword">else</span> {
            pB = pB.Next
        }
    }
    <span class="hljs-keyword">return</span> pA
}
</code></pre>
<h1>142.环形链表II</h1>
<p>见 <a href="https://marvel-l.github.io/Blog/post/xiaolin_algo_week1_day3_0x01">环形链表专题</a></p>
<h1>242.有效的字母异位词</h1>
<p>力扣链接：<a href="https://leetcode.cn/problems/valid-anagram/" target="_blank" rel="noopener noreferrer">https://leetcode.cn/problems/valid-anagram/</a></p>
<p>题目：给你两个字符串，如果这两个字符串的每个字符出现的次数都一样，返回true</p>
<h2>思路</h2>
<p>因为只有 <mark>26个字母</mark> 使用标记数组进行统计，然后在进行删除</p>
<pre><code class="hljs language-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">isAnagram</span><span class="hljs-params">(s <span class="hljs-type">string</span>, t <span class="hljs-type">string</span>)</span></span> <span class="hljs-type">bool</span> {
    st := <span class="hljs-built_in">make</span>([]<span class="hljs-type">int</span>,<span class="hljs-number">27</span>)
    <span class="hljs-keyword">for</span> _ , v := <span class="hljs-keyword">range</span> s {
        st[v - <span class="hljs-string">'a'</span>] ++ 
    }        

    <span class="hljs-keyword">for</span> _, v := <span class="hljs-keyword">range</span> t {
        st[v - <span class="hljs-string">'a'</span>] -- 
    }
    <span class="hljs-keyword">for</span> i := <span class="hljs-number">0</span> ; i &#x3C;= <span class="hljs-number">26</span>; i ++ {
        <span class="hljs-keyword">if</span> st[i] != <span class="hljs-number">0</span> {
            <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span> 
        }
    }
    <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span> 
}
</code></pre>
<h1>349. 两个数组的交集</h1>
<p>力扣链接：<a href="https://leetcode.cn/problems/intersection-of-two-arrays/" target="_blank" rel="noopener noreferrer">https://leetcode.cn/problems/intersection-of-two-arrays/</a></p>
<p>题目：求两个数组的交集</p>
<h2>思路</h2>
<ol>
<li>同样使用 一个 <mark>Map 进行统计</mark></li>
<li>不过需要注意的是，<mark>对于第一个数组需要判断是否为0 防止重复计算</mark>，<mark>对于第二个数组需要判断不等于0 防止重复计算</mark></li>
</ol>
<h2>Code</h2>
<pre><code class="hljs language-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">intersection</span><span class="hljs-params">(nums1 []<span class="hljs-type">int</span>, nums2 []<span class="hljs-type">int</span>)</span></span> []<span class="hljs-type">int</span> {
    mp := <span class="hljs-built_in">make</span>(<span class="hljs-keyword">map</span>[<span class="hljs-type">int</span>]<span class="hljs-type">int</span>)
    <span class="hljs-keyword">for</span> _ ,v := <span class="hljs-keyword">range</span> nums1 {
        <span class="hljs-keyword">if</span> mp[v] == <span class="hljs-number">0</span> {
            mp[v] ++ 
        }
    }
    <span class="hljs-keyword">for</span> _, v := <span class="hljs-keyword">range</span> nums2 {
        <span class="hljs-keyword">if</span> mp[v] != <span class="hljs-number">0</span> {
            mp[v] -- 
        }
    }

    res := <span class="hljs-built_in">make</span>([]<span class="hljs-type">int</span>,<span class="hljs-number">0</span>,<span class="hljs-built_in">len</span>(nums1))
    <span class="hljs-keyword">for</span> k ,v := <span class="hljs-keyword">range</span> mp {
        <span class="hljs-keyword">if</span> v != <span class="hljs-number">1</span> {
            res = <span class="hljs-built_in">append</span>(res, k)
        }
    }
    <span class="hljs-keyword">return</span> res 
}
</code></pre>
<h1>第202题. 快乐数</h1>
<p>力扣链接： <a href="https://leetcode.cn/problems/happy-number/" target="_blank" rel="noopener noreferrer">https://leetcode.cn/problems/happy-number/</a></p>
<p>题目： 重复计算：数字各个位 的 平方 的 和 ，直到和为1，则返回true，如果不可能为1，返回false</p>
<h2>思路</h2>
<p>模拟即可</p>
<h2>code</h2>
<pre><code class="hljs language-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">isHappy</span><span class="hljs-params">(n <span class="hljs-type">int</span>)</span></span> <span class="hljs-type">bool</span> {
    mp := <span class="hljs-built_in">make</span>(<span class="hljs-keyword">map</span>[<span class="hljs-type">int</span>]<span class="hljs-type">bool</span>)
    <span class="hljs-keyword">for</span>  {
       res :=  calc(n)
       <span class="hljs-keyword">if</span> res == <span class="hljs-number">1</span> {
            <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span> 
       }<span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> mp[res] == <span class="hljs-literal">true</span> {
            <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span> 
       }
       mp[res] =<span class="hljs-literal">true</span> 
       n = res 
    }
    <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span> 
}

<span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">calc</span><span class="hljs-params">(n <span class="hljs-type">int</span>)</span></span> <span class="hljs-type">int</span> {
    res := <span class="hljs-number">0</span> 
    <span class="hljs-keyword">for</span> n != <span class="hljs-number">0</span>  {
        wv := n % <span class="hljs-number">10</span>
        res += wv * wv 
        n /= <span class="hljs-number">10</span> 
    }
    <span class="hljs-keyword">return</span> res 
}

<span class="hljs-comment">// 111 , 3 , 9 </span>
<span class="hljs-comment">// 222 , 12 , 5, 25</span>
</code></pre></article>]]></content:encoded>
      <pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-09-29T00:00:00.000Z</atom:updated>
      <category domain="category">算法</category>
      <category domain="tag">日常</category>
      <category domain="tag">我的来时路</category>
      <author>Marvel-L</author>
    </item>
    <item>
      <title><![CDATA[环形链表 II]]></title>
      <link>https://marvel-l.github.io/Blog/post/xiaolin_algo_week1_day3_0x01</link>
      <guid isPermaLink="true">https://marvel-l.github.io/Blog/post/xiaolin_algo_week1_day3_0x01</guid>
      <description><![CDATA[我能复刻的路吗]]></description>
      <content:encoded><![CDATA[<article><h1>142.环形链表II</h1>
<p>力扣链接： <a href="https://leetcode.cn/problems/linked-list-cycle-ii/" target="_blank" rel="noopener noreferrer">https://leetcode.cn/problems/linked-list-cycle-ii/</a></p>
<p>题目： 给你一个链表，其尾部可能成环，让你返回入环的第一个节点 .</p>
<p><img src="https://marvel-l.github.io/Blog/cycle.png" alt="cycle.png"></p>
<h2>思路</h2>
<p>题目要求 :</p>
<p><mark>1. 判断是否有环</mark></p>
<p><mark>2. 判断环的入口</mark></p>
<h3>判断是否有环</h3>
<ol>
<li>使用快慢指针，快指针比慢指针多走一步 。 如果有环的话 ，那么这多走的 1 步 会在<mark>多次重复的时候相遇</mark></li>
</ol>
<h3>判断环的入口</h3>
<pre><code class="hljs language-go">head ----a----> 入口 E ----b----> 相遇点 M ----c----> 入口 E
                 └──────── 环长 C = b + c ────────┘
</code></pre>
<ul>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi></mrow><annotation encoding="application/x-tex">a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">a</span></span></span></span>：头到环入口的距离</li>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi></mrow><annotation encoding="application/x-tex">b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span></span></span></span>：入口沿环走到相遇点</li>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi></mrow><annotation encoding="application/x-tex">c</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span></span></span></span>：相遇点再走回入口</li>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>C</mi><mo>=</mo><mi>b</mi><mo>+</mo><mi>c</mi></mrow><annotation encoding="application/x-tex">C = b + c</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span></span></span></span>：环长</li>
</ul>
<h4>推导步骤</h4>
<ol>
<li>
<p><strong>快慢指针相遇</strong><br>
慢每次走 1，快每次走 2。相遇时：</p>
<ul>
<li>慢走过：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi><mo>+</mo><mi>b</mi></mrow><annotation encoding="application/x-tex">a + b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span></span></span></span></li>
<li>快走过：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi><mo>+</mo><mi>b</mi><mo>+</mo><mi>m</mi><mi>C</mi></mrow><annotation encoding="application/x-tex">a + b + mC</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">m</span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span></span></span></span>（多绕了 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span> 整圈，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi><mo>≥</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">m \ge 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7719em;vertical-align:-0.136em;"></span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>）<br>
注意：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi><mi>C</mi><mo>=</mo><mi>m</mi><mo stretchy="false">(</mo><mi>b</mi><mo>+</mo><mi>c</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">mC = m(b+c)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">m</span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">m</span><span class="mopen">(</span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">c</span><span class="mclose">)</span></span></span></span>，多走的是整圈，不是只多走 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi></mrow><annotation encoding="application/x-tex">c</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span></span></span></span>。</li>
</ul>
</li>
<li>
<p><strong>用「快 = 2 × 慢」列方程</strong></p>
</li>
</ol>
<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>a</mi><mo>+</mo><mi>b</mi><mo>+</mo><mi>m</mi><mi>C</mi><mo>=</mo><mn>2</mn><mo stretchy="false">(</mo><mi>a</mi><mo>+</mo><mi>b</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">a + b + mC = 2(a + b)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">m</span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">2</span><span class="mopen">(</span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">b</span><span class="mclose">)</span></span></span></span></span>
<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>a</mi><mo>+</mo><mi>b</mi><mo>=</mo><mi>m</mi><mi>C</mi></mrow><annotation encoding="application/x-tex">a + b = mC</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">m</span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span></span></span></span></span>
<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>a</mi><mo>=</mo><mi>m</mi><mi>C</mi><mo>−</mo><mi>b</mi><mo>=</mo><mo stretchy="false">(</mo><mi>m</mi><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo><mi>C</mi><mo>+</mo><mi>c</mi></mrow><annotation encoding="application/x-tex">a = mC - b = (m-1)C + c</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">m</span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span></span></span></span></span>
<p>（因为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>C</mi><mo>−</mo><mi>b</mi><mo>=</mo><mi>c</mi></mrow><annotation encoding="application/x-tex">C - b = c</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span></span></span></span>，所以 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi><mi>C</mi><mo>−</mo><mi>b</mi><mo>=</mo><mo stretchy="false">(</mo><mi>m</mi><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo><mi>C</mi><mo>+</mo><mi>c</mi></mrow><annotation encoding="application/x-tex">mC - b = (m-1)C + c</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">m</span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span></span></span></span>）</p>
<ol start="3">
<li>
<p><strong>同余含义</strong><br>
<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi><mo>=</mo><mo stretchy="false">(</mo><mi>m</mi><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo><mi>C</mi><mo>+</mo><mi>c</mi></mrow><annotation encoding="application/x-tex">a = (m-1)C + c</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span></span></span></span> 就是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi><mo>≡</mo><mi>c</mi><mspace></mspace><mspace width="0.4444em"></mspace><mo stretchy="false">(</mo><mrow><mi mathvariant="normal">m</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">d</mi></mrow><mspace width="0.3333em"></mspace><mi>C</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">a \equiv c \pmod{C}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4637em;"></span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≡</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span><span class="mspace allowbreak"></span><span class="mspace" style="margin-right:0.4444em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord"><span class="mord mathrm">mod</span></span></span><span class="mspace" style="margin-right:0.3333em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mclose">)</span></span></span></span>：<br>
<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi></mrow><annotation encoding="application/x-tex">a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">a</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi></mrow><annotation encoding="application/x-tex">c</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span></span></span></span> 相差整数个环长。<br>
在环上走时，走 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi></mrow><annotation encoding="application/x-tex">a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">a</span></span></span></span> 步 和 走 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi></mrow><annotation encoding="application/x-tex">c</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span></span></span></span> 步 <strong>终点相同</strong>（多走的整圈等于原地转圈）。</p>
</li>
<li>
<p><strong>找入口的做法</strong><br>
相遇后：</p>
<ul>
<li>一个指针放回 <code>head</code></li>
<li>另一个留在相遇点 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi></mrow><annotation encoding="application/x-tex">M</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.109em;">M</span></span></span></span></li>
<li>两个都每次走 1 步</li>
</ul>
<p>从头走 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi></mrow><annotation encoding="application/x-tex">a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">a</span></span></span></span> 步 → 到入口。<br>
从 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi></mrow><annotation encoding="application/x-tex">M</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.109em;">M</span></span></span></span> 走 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi></mrow><annotation encoding="application/x-tex">a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">a</span></span></span></span> 步 = 走 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi><mo>+</mo><mo stretchy="false">(</mo><mi>m</mi><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo><mi>C</mi></mrow><annotation encoding="application/x-tex">c + (m-1)C</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">c</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span></span></span></span> 步 → 先空转 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>m</mi><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(m-1)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span></span></span></span> 圈，再走 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi></mrow><annotation encoding="application/x-tex">c</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span></span></span></span> → 也到入口。</p>
<p><mark>再次相遇的点就是环入口。</mark></p>
</li>
</ol>
<h4>小例子</h4>
<pre><code>1 → 2 → 3 → 4
         ↑   ↓
         6 ← 5
</code></pre>
<p>入口是 3，环长 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>C</mi><mo>=</mo><mn>4</mn></mrow><annotation encoding="application/x-tex">C=4</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">4</span></span></span></span>。若在 5 相遇：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi><mo>=</mo><mn>2</mn><mo separator="true">,</mo><mtext> </mtext><mi>b</mi><mo>=</mo><mn>2</mn><mo separator="true">,</mo><mtext> </mtext><mi>c</mi><mo>=</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">a=2,\ b=2,\ c=2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8389em;vertical-align:-0.1944em;"></span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">c</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">2</span></span></span></span>。<br>
检查：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi><mo>+</mo><mi>b</mi><mo>=</mo><mn>4</mn><mo>=</mo><mn>1</mn><mo>⋅</mo><mi>C</mi></mrow><annotation encoding="application/x-tex">a+b=4=1\cdot C</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">4</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span></span></span></span>，且 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi><mo>=</mo><mi>c</mi><mo>=</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">a=c=2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">2</span></span></span></span>。<br>
从头：1→2→<strong>3</strong>；从 5：5→6→<strong>3</strong>。两步后都到入口。</p>
<h2>Code</h2>
<pre><code class="hljs language-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">detectCycle</span><span class="hljs-params">(head *ListNode)</span></span> *ListNode {
    slow,fast := head,head 
    <span class="hljs-keyword">for</span> fast != <span class="hljs-literal">nil</span> &#x26;&#x26; fast.Next != <span class="hljs-literal">nil</span> {
        slow = slow.Next
        fast = fast.Next.Next
        <span class="hljs-keyword">if</span> slow == fast {
            <span class="hljs-keyword">for</span> head != slow {
                head = head.Next
                slow = slow.Next
            }
            <span class="hljs-keyword">return</span> slow 
        }
    }
    <span class="hljs-keyword">return</span> <span class="hljs-literal">nil</span> 
}
</code></pre></article>]]></content:encoded>
      <pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-09-29T00:00:00.000Z</atom:updated>
      <category domain="category">算法</category>
      <category domain="tag">日常</category>
      <category domain="tag">我的来时路</category>
      <category domain="tag">链表</category>
      <category domain="tag">环</category>
      <author>Marvel-L</author>
    </item>
    <item>
      <title><![CDATA[2026 国庆日程安排]]></title>
      <link>https://marvel-l.github.io/Blog/post/2026-%E5%9B%BD%E5%BA%86%E5%AE%89%E6%8E%92-0x01</link>
      <guid isPermaLink="true">https://marvel-l.github.io/Blog/post/2026-%E5%9B%BD%E5%BA%86%E5%AE%89%E6%8E%92-0x01</guid>
      <description><![CDATA[没有去玩，而是去见女朋友]]></description>
      <content:encoded><![CDATA[<article><h1>日程规划</h1>
<p>10-2日 : 出发, 预计晚上 20.45 到</p>
<p>10-3日 : 完整的一天</p>
<p>10-4日 : 完整的一天</p>
<p>10-5日 : 完整的一天</p>
<p>10-6日 : 准备返程 <mark>抢票中</mark></p>
<div data-role="markdown-image-row" class="markdown-image-row"><img src="https://marvel-l.github.io/Blog/jiu_dian.jpg" alt="jiu_dian.jpg" class="inline"> <img src="https://marvel-l.github.io/Blog/feiji.jpg" alt="feiji.jpg" class="inline"> <img src="https://marvel-l.github.io/Blog/gaotie.jpg" alt="gaotie.jpg" class="inline"></div>
<h1>一些日期的规划</h1>
<h2>10-3日</h2>
<p>去步步高吃个饭, 然后去几多全买点零食 用于在酒店摆烂</p>
<ol>
<li>买点蛋糕</li>
<li>麻辣</li>
<li>锅巴</li>
<li>干果什么的</li>
</ol>
<h2>10-4 | 10-5 日</h2>
<p>暂时没有想法,  可以考虑在酒店学习 然后晚上跑步</p>
<p>10-5日晚上 预计去河边散散步</p>
<h2>10-6 日</h2>
<p>准备返程</p>
<p>去满意饭店或者是哪个饭店再吃一顿 然后走人</p>
<h2>想做的事</h2>
<ol>
<li>
<p>去一次 KTV . 这次就是真唱歌了</p>
</li>
<li>
<p>做爱</p>
<p>i. 持久性 和 勃起兴药物尝试</p>
<p>ii. 更多动作的尝试</p>
</li>
<li>
<p>河边散步（晚上）</p>
</li>
<li>
<p>吃一顿好吃的 (煲)</p>
</li>
<li>
<p>一起去拔罐</p>
</li>
</ol></article>]]></content:encoded>
      <pubDate>Mon, 28 Sep 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-09-30T00:00:00.000Z</atom:updated>
      <category domain="category">日常</category>
      <category domain="tag">日常</category>
      <category domain="tag">假期</category>
      <author>Marvel-L</author>
    </item>
    <item>
      <title><![CDATA[为什么传了指针，值还是没改掉]]></title>
      <link>https://marvel-l.github.io/Blog/post/go-pointer-pass-by-value-0x01</link>
      <guid isPermaLink="true">https://marvel-l.github.io/Blog/post/go-pointer-pass-by-value-0x01</guid>
      <description><![CDATA[一次非常典型的 Go 认知误差：传的是指针，但函数参数依然是值传递。]]></description>
      <content:encoded><![CDATA[<article><h1>先说结论</h1>
<p>很多人第一次看到下面这段 Go 代码，都会以为输出应该是 <code>100</code>：</p>
<pre><code class="hljs language-go"><span class="hljs-keyword">package</span> main

<span class="hljs-keyword">import</span> <span class="hljs-string">"fmt"</span>

<span class="hljs-keyword">type</span> Node <span class="hljs-keyword">struct</span> {
	Val <span class="hljs-type">int</span>
}

<span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">changePointer</span><span class="hljs-params">(n *Node)</span></span> {
	n = &#x26;Node{Val: <span class="hljs-number">100</span>}
}

<span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">main</span><span class="hljs-params">()</span></span> {
	x := Node{Val: <span class="hljs-number">1</span>}
	changePointer(&#x26;x)
	fmt.Println(x.Val) <span class="hljs-comment">// 1</span>
}
</code></pre>
<p>实际输出却是 <code>1</code>。</p>
<p>这不是 Go 的指针“失效”了，也不是编译器做了什么特殊优化。真正的原因只有一句话：</p>
<blockquote>
<p>Go 的函数参数永远是值传递，指针也只是“一个值”。</p>
</blockquote>
<p>这里最容易产生认知误差的地方在于：</p>
<ol>
<li>我们确实传入了指针</li>
<li>但传入的是“地址值的一份拷贝”</li>
<li>你在函数里改的是这份拷贝，不是外面的变量本身</li>
</ol>
<hr>
<h1>第一层理解：你改的是谁</h1>
<p>先不要急着想“指针不是能改外部对象吗”，先把这行代码看清楚：</p>
<pre><code class="hljs language-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">changePointer</span><span class="hljs-params">(n *Node)</span></span> {
	n = &#x26;Node{Val: <span class="hljs-number">100</span>}
}
</code></pre>
<p>这里的 <code>n = ...</code> 改的不是 <code>*n</code>，而是 <code>n</code> 这个局部变量。</p>
<p>也就是说：</p>
<ul>
<li><code>n.Val = 100</code> 是“顺着指针去改它指向的内容”</li>
<li><code>n = &#x26;Node{Val: 100}</code> 是“让局部指针变量重新指向别的对象”</li>
</ul>
<p>这两个动作看起来都和指针有关，但影响范围完全不同。</p>
<p><img src="https://marvel-l.github.io/Blog/pointer-copy.svg" alt="指针值被复制"></p>
<p>上图里发生的事情可以概括成：</p>
<ol>
<li><code>main</code> 里有一个变量 <code>x</code></li>
<li><code>&#x26;x</code> 产生一个地址值</li>
<li>调用 <code>changePointer(&#x26;x)</code> 时，Go 把这个地址值复制给形参 <code>n</code></li>
<li>函数内部把 <code>n</code> 指向了新对象</li>
<li>外面的 <code>x</code> 从头到尾都没变</li>
</ol>
<p>所以最终输出还是 <code>1</code>。</p>
<hr>
<h1>第二层理解：Go 里“传指针”不等于“引用传递”</h1>
<p>很多人之所以会在这里绕住，是因为脑子里默认有这样一个联想：</p>
<blockquote>
<p>传入指针 = 可以改外面的东西</p>
</blockquote>
<p>这句话只说对了一半。</p>
<p>更准确地说应该是：</p>
<blockquote>
<p>传入指针后，你可以通过这份指针副本，修改它当前指向的那块内存。</p>
</blockquote>
<p>但是你不能仅靠修改这份“副本指针变量”，去修改外面的指针变量本身。</p>
<p>看两个对照例子就清楚了。</p>
<h2>例子一：修改指针指向的内容</h2>
<pre><code class="hljs language-go"><span class="hljs-keyword">package</span> main

<span class="hljs-keyword">import</span> <span class="hljs-string">"fmt"</span>

<span class="hljs-keyword">type</span> Node <span class="hljs-keyword">struct</span> {
	Val <span class="hljs-type">int</span>
}

<span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">changeValue</span><span class="hljs-params">(n *Node)</span></span> {
	n.Val = <span class="hljs-number">100</span>
}

<span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">main</span><span class="hljs-params">()</span></span> {
	x := Node{Val: <span class="hljs-number">1</span>}
	changeValue(&#x26;x)
	fmt.Println(x.Val) <span class="hljs-comment">// 100</span>
}
</code></pre>
<p>这里输出 <code>100</code>，因为：</p>
<ul>
<li><code>n</code> 和 <code>&#x26;x</code> 虽然不是同一个变量</li>
<li>但它们一开始保存的是同一个地址</li>
<li><code>n.Val = 100</code> 改的是那块地址上的内容</li>
<li>所以外面的 <code>x</code> 会一起变化</li>
</ul>
<h2>例子二：修改局部指针变量自己的指向</h2>
<pre><code class="hljs language-go"><span class="hljs-keyword">package</span> main

<span class="hljs-keyword">import</span> <span class="hljs-string">"fmt"</span>

<span class="hljs-keyword">type</span> Node <span class="hljs-keyword">struct</span> {
	Val <span class="hljs-type">int</span>
}

<span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">changePointer</span><span class="hljs-params">(n *Node)</span></span> {
	n = &#x26;Node{Val: <span class="hljs-number">100</span>}
}

<span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">main</span><span class="hljs-params">()</span></span> {
	x := Node{Val: <span class="hljs-number">1</span>}
	changePointer(&#x26;x)
	fmt.Println(x.Val) <span class="hljs-comment">// 1</span>
}
</code></pre>
<p>这里输出 <code>1</code>，因为 <code>n = ...</code> 只是把 <code>n</code> 这份地址副本改掉了，外面的 <code>x</code> 仍然是原来的对象。</p>
<hr>
<h1>第三层理解：如果真想改“外面的指针本身”，要传二级指针</h1>
<p>如果你的目标不是“改对象内容”，而是“让外面的指针改为指向新对象”，那就不能只传 <code>*Node</code>，而要传 <code>**Node</code>。</p>
<pre><code class="hljs language-go"><span class="hljs-keyword">package</span> main

<span class="hljs-keyword">import</span> <span class="hljs-string">"fmt"</span>

<span class="hljs-keyword">type</span> Node <span class="hljs-keyword">struct</span> {
	Val <span class="hljs-type">int</span>
}

<span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">replacePointer</span><span class="hljs-params">(n **Node)</span></span> {
	*n = &#x26;Node{Val: <span class="hljs-number">100</span>}
}

<span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">main</span><span class="hljs-params">()</span></span> {
	x := &#x26;Node{Val: <span class="hljs-number">1</span>}
	replacePointer(&#x26;x)
	fmt.Println(x.Val) <span class="hljs-comment">// 100</span>
}
</code></pre>
<p>为什么这里就能改掉？</p>
<p>因为这次你拿到的不是“Node 的指针”，而是“外部指针变量 <code>x</code> 的地址”。</p>
<p>所以：</p>
<ul>
<li><code>n</code> 指向的是外部变量 <code>x</code></li>
<li><code>*n = ...</code> 等价于“给外部的 <code>x</code> 重新赋值”</li>
<li>这时外面的指针本身就真的被改掉了</li>
</ul>
<p><img src="https://marvel-l.github.io/Blog/pointer-double.svg" alt="二级指针修改外部指针"></p>
<p>这个例子也说明了一个很重要的区分：</p>
<ul>
<li><code>n = ...</code> 改的是局部变量</li>
<li><code>*n = ...</code> 改的是外部变量</li>
</ul>
<hr>
<h1>第四层理解：为什么你会觉得 C++ 里能改</h1>
<p>这个误区很常见，因为 C++ 里确实有一种写法会让外部指针发生变化，但那通常不是“普通指针传参”，而是“指针的引用”。</p>
<p>先看 C++ 里和 Go 当前行为等价的写法：</p>
<pre><code class="hljs language-cpp"><span class="hljs-keyword">struct</span> <span class="hljs-title class_">Node</span> {
    <span class="hljs-type">int</span> val;
};

<span class="hljs-function"><span class="hljs-type">void</span> <span class="hljs-title">changePointer</span><span class="hljs-params">(Node* n)</span> </span>{
    n = <span class="hljs-keyword">new</span> Node{<span class="hljs-number">100</span>};
}
</code></pre>
<p>这段 C++ 和 Go 一样，外面也不会变。</p>
<p>因为本质上还是：</p>
<ul>
<li>把一个地址值复制给形参 <code>n</code></li>
<li>然后在函数内部修改 <code>n</code> 这份副本</li>
</ul>
<p>真正能改外部指针的是这种写法：</p>
<pre><code class="hljs language-cpp"><span class="hljs-keyword">struct</span> <span class="hljs-title class_">Node</span> {
    <span class="hljs-type">int</span> val;
};

<span class="hljs-function"><span class="hljs-type">void</span> <span class="hljs-title">changePointer</span><span class="hljs-params">(Node*&#x26; n)</span> </span>{
    n = <span class="hljs-keyword">new</span> Node{<span class="hljs-number">100</span>};
}
</code></pre>
<p>这里的 <code>Node*&#x26;</code> 是“指针的引用”，它更接近 Go 里的 <code>**Node</code> 效果。</p>
<p>所以如果你记忆里“我在 C++ 这么写能改掉”，大概率你当时写的是：</p>
<ul>
<li>引用 <code>T&#x26;</code></li>
<li>或者指针引用 <code>T*&#x26;</code></li>
<li>或者二级指针 <code>T**</code></li>
</ul>
<p>而不是单纯的“指针按值传递”。</p>
<hr>
<h1>一张表记住这件事</h1>
<table>
<thead>
<tr>
<th>写法</th>
<th>改到的是什么</th>
<th>外部结果</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>n.Val = 100</code></td>
<td>指针指向的内容</td>
<td>外部对象会变</td>
</tr>
<tr>
<td><code>*n = Node{Val: 100}</code></td>
<td>指针指向的整个对象</td>
<td>外部对象会变</td>
</tr>
<tr>
<td><code>n = &#x26;Node{Val: 100}</code></td>
<td>局部指针变量 <code>n</code> 自己</td>
<td>外部不会变</td>
</tr>
<tr>
<td><code>*pp = &#x26;Node{Val: 100}</code></td>
<td>外部指针变量本身</td>
<td>外部指针会变</td>
</tr>
</tbody>
</table>
<p>如果只记一句话，可以记这个：</p>
<blockquote>
<p>Go 永远是值传递。传指针，只是把“地址值”复制了一份。</p>
</blockquote>
<hr>
<h1>最容易写错的三组实验</h1>
<p>下面这三组代码建议你自己跑一遍，认知会非常稳定。</p>
<h2>实验一：修改字段</h2>
<pre><code class="hljs language-go"><span class="hljs-keyword">package</span> main

<span class="hljs-keyword">import</span> <span class="hljs-string">"fmt"</span>

<span class="hljs-keyword">type</span> Node <span class="hljs-keyword">struct</span> {
	Val <span class="hljs-type">int</span>
}

<span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">f</span><span class="hljs-params">(n *Node)</span></span> {
	n.Val = <span class="hljs-number">200</span>
}

<span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">main</span><span class="hljs-params">()</span></span> {
	x := Node{Val: <span class="hljs-number">1</span>}
	f(&#x26;x)
	fmt.Println(x.Val) <span class="hljs-comment">// 200</span>
}
</code></pre>
<p>这里你改的是“地址里的内容”。</p>
<h2>实验二：重新绑定局部指针</h2>
<pre><code class="hljs language-go"><span class="hljs-keyword">package</span> main

<span class="hljs-keyword">import</span> <span class="hljs-string">"fmt"</span>

<span class="hljs-keyword">type</span> Node <span class="hljs-keyword">struct</span> {
	Val <span class="hljs-type">int</span>
}

<span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">f</span><span class="hljs-params">(n *Node)</span></span> {
	n = &#x26;Node{Val: <span class="hljs-number">200</span>}
}

<span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">main</span><span class="hljs-params">()</span></span> {
	x := Node{Val: <span class="hljs-number">1</span>}
	f(&#x26;x)
	fmt.Println(x.Val) <span class="hljs-comment">// 1</span>
}
</code></pre>
<p>这里你改的是局部变量 <code>n</code> 的指向。</p>
<h2>实验三：传二级指针</h2>
<pre><code class="hljs language-go"><span class="hljs-keyword">package</span> main

<span class="hljs-keyword">import</span> <span class="hljs-string">"fmt"</span>

<span class="hljs-keyword">type</span> Node <span class="hljs-keyword">struct</span> {
	Val <span class="hljs-type">int</span>
}

<span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">f</span><span class="hljs-params">(n **Node)</span></span> {
	*n = &#x26;Node{Val: <span class="hljs-number">200</span>}
}

<span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">main</span><span class="hljs-params">()</span></span> {
	x := &#x26;Node{Val: <span class="hljs-number">1</span>}
	f(&#x26;x)
	fmt.Println(x.Val) <span class="hljs-comment">// 200</span>
}
</code></pre>
<p>这里你拿到了外部指针变量的地址，因此能把外部指针重新绑定到新对象。</p>
<hr>
<h1>实战里怎么判断该用哪一种</h1>
<p>如果你在业务代码里遇到类似场景，可以按目的来选：</p>
<h2>只想改对象内容</h2>
<p>用 <code>*T</code> 就够了。</p>
<pre><code class="hljs language-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">fillUser</span><span class="hljs-params">(u *User)</span></span> {
	u.Name = <span class="hljs-string">"Alice"</span>
	u.Age = <span class="hljs-number">18</span>
}
</code></pre>
<p>这类写法最常见，也最符合直觉。</p>
<h2>想在函数里“创建对象并回填出去”</h2>
<p>可以考虑返回值，通常比 <code>**T</code> 更自然：</p>
<pre><code class="hljs language-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">newNode</span><span class="hljs-params">()</span></span> *Node {
	<span class="hljs-keyword">return</span> &#x26;Node{Val: <span class="hljs-number">100</span>}
}
</code></pre>
<p>大多数情况下，Go 更鼓励这种写法，而不是到处传二级指针。</p>
<h2>必须修改外部指针本身</h2>
<p>这时再考虑 <code>**T</code>：</p>
<pre><code class="hljs language-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">reset</span><span class="hljs-params">(n **Node)</span></span> {
	*n = <span class="hljs-literal">nil</span>
}
</code></pre>
<p>但要注意，<code>**T</code> 会显著增加阅读成本，除非这个语义非常明确，否则优先考虑返回值。</p>
<hr>
<h1>最后，把认知纠正成一句完整的话</h1>
<p>错误直觉通常是：</p>
<blockquote>
<p>我传的是指针，所以函数里改了它，外面一定会变。</p>
</blockquote>
<p>更准确的理解应该是：</p>
<blockquote>
<p>Go 中参数总是值传递。即使传入的是指针，也只是把地址值复制给形参。<br>
通过这个地址可以修改它指向的内容，但不能仅靠修改形参本身，去改变外部变量。</p>
</blockquote>
<p>当你把“指针”和“引用传递”这两个概念拆开后，这类问题基本就不会再绕住了。</p>
<p>如果以后再遇到类似代码，先问自己两个问题：</p>
<ol>
<li>我现在改的是 <code>n</code>，还是 <code>*n</code>？</li>
<li>我想改的是对象内容，还是外面的指针变量本身？</li>
</ol>
<p>这两个问题一旦分清，答案通常就直接出来了。</p></article>]]></content:encoded>
      <pubDate>Mon, 28 Sep 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-09-28T00:00:00.000Z</atom:updated>
      <category domain="category">Golang</category>
      <category domain="tag">Go</category>
      <category domain="tag">指针</category>
      <category domain="tag">值传递</category>
      <category domain="tag">C++</category>
      <author>Marvel-L</author>
    </item>
    <item>
      <title><![CDATA[ReRe 北京工作切换 🚀]]></title>
      <link>https://marvel-l.github.io/Blog/post/%E5%8C%97%E4%BA%AC%E5%B7%A5%E4%BD%9C%E5%88%87%E6%8D%A2-0x03</link>
      <guid isPermaLink="true">https://marvel-l.github.io/Blog/post/%E5%8C%97%E4%BA%AC%E5%B7%A5%E4%BD%9C%E5%88%87%E6%8D%A2-0x03</guid>
      <description><![CDATA[再起步！]]></description>
      <content:encoded><![CDATA[<article><h1>小谈</h1>
<p>今天是入职的 第二周，第一天。 可以认为 <mark>我在这家公司待了 4 天了</mark>, 今天中午吃饭的时候遇到了之前一起入职的一个大哥 <code>@李鸣波</code></p>
<p>简单交流了一下，他是做 <code>数据开发</code> 的</p>
<ol>
<li>问我当初说要走为什么没走</li>
<li>当初一起入职的一个 13年 工作经验的老哥已经走了</li>
<li>沟通加班情况</li>
<li>沟通 Leader 散养情况</li>
</ol>
<p>反问 :</p>
<ol>
<li>你为什么不走呢</li>
</ol>
<h2>问我当初说要走为什么没走</h2>
<p>我一开始没有给出很好的回答，但是刚刚睡午觉的时候 脑子里面还在想，或许我可以给出几个回答</p>
<h3>房租问题</h3>
<ol>
<li>我的房租是 押一付三的 , 并且北京房租昂贵，而且还被收了一笔 暖气费 和 中介费 ， <mark>导致我一次性付了 <code>1w3</code> 多 。</mark></li>
</ol>
<p>当然我这个也并不是没有办法, 解决办法如下 :</p>
<ol>
<li>房屋转租出去</li>
<li>但是我付的 1000 块钱 暖气费 和 1200 块钱中介费 以及我来北京大概花了 1000 块钱的交通费 还有买了一些物品的无非 也可以预估在 1000</li>
<li>总共估计 <code>4000</code> 块钱 ！ 另外还有一个问题就是 我要回哪里，应该去哪里。回去又要一笔费用 又要花 <code>1000</code> 块钱</li>
</ol>
<p>损失成本貌似太高了 。 但是一直有一句话是这么说的 <mark>沉默成本不参与重大决策</mark>, 不过看样子 我并不是很好的一个践行者</p>
<h3>何去何从问题</h3>
<p>我这次社招 可以说并没有找到 一份好工作。 或者说 我没有找到其他工作， 可能是因为市场原因 也可能 是因为我 <mark>个人原因</mark></p>
<p>因此我只能被动的选择来到北京， 如果我立马跑路就会有新的问题</p>
<ol>
<li>
<p>我该去哪里 ？ 我家里农村的，只能回大山里去，我女朋友还在考研 我不能打扰他</p>
</li>
<li>
<p>我该怎么办 ？</p>
<p>i. 继续面试 ？ 可是我岗位都投的差不多了，面试也没多少啦</p>
<p>ii. 如果没有找到工作怎么办？</p>
</li>
</ol>
<h3>懒惰！</h3>
<ol>
<li>首先我的Leader是散养我们外包人员的，而且一开始也没安排什么开发任务。 虽然电脑不能摸鱼，但是也很轻松，这倒是我想歇息一下</li>
<li>另外我组的其他同事并没有出现加班的情况，所以我感觉很安逸</li>
</ol>
<h2>当初一起入职的一个 13年 工作经验的老哥已经走了</h2>
<p>这个老哥 周二入职的，周五就跑了 。 说是他本来就有好几个Offer，而且说 我们这里团队氛围不行，没有 Leader 带，组内也没合作</p>
<p>不得不承认 <mark>工作经验丰富的人 行事就是迅速果断</mark> , 我虽然骂遍了北京和工作，但是还是没能走</p>
<ol>
<li>我要经验没经验</li>
<li>要存款没存款</li>
</ol>
<p>所以我留了下来</p>
<h2>沟通加班情况</h2>
<p>他们组是 10:00 上班，然后下午 20:00 下班，但是中午人均弄到 14:00 才上班</p>
<p>虽然规定是 13:00 上班，但是实际上很多人都是 14:00 才开始上班</p>
<p>但是我们组更夸张</p>
<ol>
<li>9:30 来，18:30走，中间可能午休到 14:00  。</li>
</ol>
<p>我有时候不太相信命，但是好像又不得不相信？ 这么空的时间 难道是为了让我好好准备再次跳吗</p>
<h2>沟通 Leader 散养情况</h2>
<p>他和我一样，都是 Leader 第一天发了一个文档过来，然后就没有后续了</p>
<p>直接开始散养，也没有每天的工作安排 也没有任务什么的</p>
<h2>反问 : 你为什么不走呢</h2>
<p>他说 :</p>
<ol>
<li>我是做数据开发的，字节可以说是全中国最大的数据中心了。 我想要刷点经验再走</li>
</ol>
<h1>其他</h1>
<p>说实话 我也想要偷个项目再走，因为我并没有直接离开的决心和勇气</p>
<p>不过刚刚看了一下最近的日报，我看之前比我先来的两个同事 都没有干较为 完整的活。 或者说至少没有我上家公司一样，有几个完全属于自己的模块</p>
<h2>谁会为你的选择买单</h2>
<p>我一直在想一个点，市场是冰冷的，谁会为你的错误选择买单，貌似只有我自己能买单</p>
<ol>
<li>一开始选择了 就业面窄 的 Web3，同时还选择了 CEFI 而不是 DEFI 。 另外还是小公司 还是 远程</li>
<li>现在又选择了外包</li>
</ol>
<p>我表面上对外说，那家给的钱多所以我才去的，但是钱多又有什么用，我感觉我在自寻死路，自觉坟墓</p>
<p>不可能出现一份工作 <mark>我看你好可怜，你的履历真波折，那你就跟我干吧</mark> 市场是冰冷的 我或许只能为我自己买单</p>
<h2>我究竟是哪一步走错了</h2>
<p>往近了说</p>
<ol>
<li>
<p>裁员之后第一个月 我去单独写一个项目，用于C端面试 做了 <code>支付、登陆、短信、Feed、热榜</code> 等设计 还补了 一个 Ai-Agent 用于丰富简历</p>
<p>i. 但是其实这里被问的概率很小，大部分人都问 你上家工作干嘛了，做了什么事</p>
</li>
</ol>
<p>我感觉我这一步走错了，我那一个月应该 整理代码模块，把我负责的内容，梳理成多个项目</p>
<p>但是我最终梳理成了好几个 Backlog ？ 例如 优化数据库表、AsyncFlow 什么的内容 看着只是一个需求 而不是一个任务</p>
<ol start="2">
<li>
<p>社招的时候看着也走错了好几步</p>
<p>i. 八股文背的太少啦，或者是时间太短了</p>
<p>ii. 算法题 有一些还是不熟悉</p>
<p>iii. 项目写完其实也忘的差不多了，公司的也是。导致语言上说话有漏洞，或者说听上去观感不佳，而且反问的时候 不能立马回应，而需要思考</p>
</li>
<li>
<p>选择工作的时候也是</p>
<p>i. 如果我提前来过北京，我肯定是不会去北京的</p>
<p>ii. 我可能会继续找 深圳广东长沙 的工作，不应该这么着急 或者说 投递北京的岗位的</p>
</li>
</ol>
<p>我记得当初我选择来北京，自己骗自己说是 <mark>为了见见世面</mark> 可是现在好了，世面见到了，我反而不好脱身了</p>
<h2>下一步应该怎么办</h2>
<p>不知道 TBD</p></article>]]></content:encoded>
      <pubDate>Mon, 28 Sep 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-09-28T00:00:00.000Z</atom:updated>
      <category domain="category">重要决策</category>
      <category domain="tag">life</category>
      <category domain="tag">工作</category>
      <category domain="tag">重要选择</category>
      <author>Marvel-L</author>
    </item>
    <item>
      <title><![CDATA[26年 支撑竞速跑鞋 选择]]></title>
      <link>https://marvel-l.github.io/Blog/post/26%E5%B9%B4%E6%96%B0%E8%B7%91%E9%9E%8B-0x01</link>
      <guid isPermaLink="true">https://marvel-l.github.io/Blog/post/26%E5%B9%B4%E6%96%B0%E8%B7%91%E9%9E%8B-0x01</guid>
      <description><![CDATA[选一款跑鞋用于公园跑]]></description>
      <content:encoded><![CDATA[<article><h1>标准</h1>
<ol>
<li>颜值: 较为简约 颜色不需要要鲜艳，外形好看 满足日常上班通勤</li>
<li>底部: 不需要较为大的缓震的底，因为在公园路不太好跑，容易崴脚</li>
<li>价格: 500左右</li>
</ol>
<h1>李宁</h1>
<p>李宁看下来只有 赤兔9 PRO 合适，毕竟初中的时候 穿过 赤兔1 感觉挺不错的</p>
<p>不过还没有试过脚感</p>
<p><img src="https://marvel-l.github.io/Blog/lining_0x01.png" alt="lining" class="small"></p>
<h1>安踏</h1>
<p>看着 C202 和 二区心率 90都挺不错</p>
<p><img src="https://marvel-l.github.io/Blog/anta.png" alt="anta" class="small"></p>
<h1>特步</h1>
<p>看着 160x 8.0 和 两千公里 5 PRO 都挺好的6</p>
<p>160x8.0 800+了 ，感觉可以看看 3.0 5.0pro</p>
<p><img src="https://marvel-l.github.io/Blog/xtep.png" alt="xtep" class="small"></p>
<h1>Nike</h1>
<p>迈柔 18 ， 大概 500左右</p>
<p><img src="https://marvel-l.github.io/Blog/nike.png" alt="nike.png" class="small"></p>
<h1>Adidas</h1>
<p>波士顿13 和 EVO SL</p>
<p><img src="https://marvel-l.github.io/Blog/adidas.png" alt="adidas" class="small"></p>
<h1>Prompts</h1>
<p>我现在的跑鞋是 Nike 迈柔Plus，我身高 165， 体重140 ，前脚掌着地</p>
<p>最近跑步场地变为公园跑，公园有一些高低不平的地，对于 Nike 迈柔Plus 这种顶缓 会导致我可能崴脚，感觉很考验我的脚踝力量</p>
<p>所以我想要更换一个跑鞋，有以下几个选择，满分100分，请你给他们打分，并且按照优先级输出</p>
<ol>
<li>李宁 -  赤兔9 PRO</li>
<li>安踏 C202 7代</li>
<li>二区心率 90</li>
<li>特步 160x 8.0pro</li>
<li>特步 两千公里5 Pro</li>
<li>特步 160x 3.0 5.0pro这种系列</li>
<li>Nike 迈柔18 非plus</li>
<li>Adidas 波士顿13</li>
<li>Adidas EVO SL</li>
</ol>
<h2>Deepseek</h2>
<table>
<thead>
<tr>
<th align="center">优先级</th>
<th align="left">跑鞋型号</th>
<th align="center">评分</th>
<th align="left">核心评价</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center"><strong>1</strong></td>
<td align="left"><strong>特步 两千公里5 Pro</strong></td>
<td align="center"><strong>92</strong></td>
<td align="left">宽楦+抗扭片提供极致稳定，公园路面最佳选择</td>
</tr>
<tr>
<td align="center"><strong>2</strong></td>
<td align="left"><strong>李宁 赤兔9 PRO</strong></td>
<td align="center"><strong>88</strong></td>
<td align="left">翼状TPU支撑+加宽中底，稳定与灵活兼备</td>
</tr>
<tr>
<td align="center"><strong>3</strong></td>
<td align="left"><strong>Nike 迈柔18 非Plus</strong></td>
<td align="center"><strong>85</strong></td>
<td align="left">双层密度中底，比Plus版更稳定，路面适应好</td>
</tr>
<tr>
<td align="center"><strong>4</strong></td>
<td align="left"><strong>Adidas 波士顿13</strong></td>
<td align="center"><strong>80</strong></td>
<td align="left">后跟支撑扎实，前掌灵活，但对足弓支撑偏弱</td>
</tr>
<tr>
<td align="center"><strong>5</strong></td>
<td align="left"><strong>特步 160x 5.0pro</strong></td>
<td align="center"><strong>72</strong></td>
<td align="left">碳板竞速鞋中稳定性较强，但对脚踝力量要求高</td>
</tr>
<tr>
<td align="center"><strong>6</strong></td>
<td align="left"><strong>安踏 C202 7代</strong></td>
<td align="center"><strong>68</strong></td>
<td align="left">碳板推进感强，但稳定性一般，长距离支撑不足</td>
</tr>
<tr>
<td align="center"><strong>7</strong></td>
<td align="left"><strong>特步 160x 8.0pro</strong></td>
<td align="center"><strong>55</strong></td>
<td align="left">稳定性偏弱，低速慢跑脚感生硬，不适合公园路面</td>
</tr>
<tr>
<td align="center"><strong>8</strong></td>
<td align="left"><strong>Adidas EVO SL</strong></td>
<td align="center"><strong>50</strong></td>
<td align="left">侧向稳定性差，不适合不平整路面</td>
</tr>
<tr>
<td align="center"><strong>9</strong></td>
<td align="left"><strong>二区心率 90</strong></td>
<td align="center"><strong>42</strong></td>
<td align="left">中底软、足弓支撑弱，脚踝力量差者需谨慎</td>
</tr>
</tbody>
</table>
<h2>ChatGpt</h2>
<table>
<thead>
<tr>
<th>排名</th>
<th>跑鞋</th>
<th align="right">综合分</th>
<th align="right"><strong>你的场景适配</strong></th>
<th>核心评价</th>
</tr>
</thead>
<tbody>
<tr>
<td>🥇 1</td>
<td><strong>李宁 赤兔9 PRO</strong></td>
<td align="right"><strong>92</strong></td>
<td align="right">⭐⭐⭐⭐⭐</td>
<td><strong>最符合你的需求</strong></td>
</tr>
<tr>
<td>🥈 2</td>
<td><strong>特步 两千公里5 PRO</strong></td>
<td align="right"><strong>90</strong></td>
<td align="right">⭐⭐⭐⭐⭐</td>
<td>稳定、耐久，但脚感偏韧</td>
</tr>
<tr>
<td>🥉 3</td>
<td><strong>安踏 C202 7代</strong></td>
<td align="right"><strong>87</strong></td>
<td align="right">⭐⭐⭐⭐½</td>
<td>稳定和前掌跑法比较合适</td>
</tr>
<tr>
<td>4</td>
<td><strong>Adidas Boston 13</strong></td>
<td align="right"><strong>85</strong></td>
<td align="right">⭐⭐⭐⭐</td>
<td>稳，但更偏训练/提速</td>
</tr>
<tr>
<td>5</td>
<td><strong>特步 160X 5.0 PRO</strong></td>
<td align="right"><strong>82</strong></td>
<td align="right">⭐⭐⭐½</td>
<td>前掌跑友好，但不一定适合你当前需求</td>
</tr>
<tr>
<td>6</td>
<td><strong>特步 160X 8.0 PRO</strong></td>
<td align="right"><strong>80</strong></td>
<td align="right">⭐⭐⭐½</td>
<td>性能很强，但明显不是你的最优解</td>
</tr>
<tr>
<td>7</td>
<td><strong>Nike 迈柔18 非Plus</strong></td>
<td align="right"><strong>77</strong></td>
<td align="right">⭐⭐⭐</td>
<td>比 Plus 更适合，但解决不了根本问题</td>
</tr>
<tr>
<td>8</td>
<td><strong>特步 160X 3.0 / 3.0 PRO</strong></td>
<td align="right"><strong>74</strong></td>
<td align="right">⭐⭐⭐</td>
<td>偏性能，不建议为了“稳”去买</td>
</tr>
<tr>
<td>9</td>
<td><strong>Adidas EVO SL</strong></td>
<td align="right"><strong>70</strong></td>
<td align="right">⭐⭐½</td>
<td><strong>你的这个场景我反而不推荐</strong></td>
</tr>
</tbody>
</table>
<h2>gork</h2>
<table>
<thead>
<tr>
<th>优先级</th>
<th>鞋款</th>
<th>满分</th>
<th>重量 (g)</th>
<th>缓震</th>
<th>稳定性</th>
<th>回弹</th>
<th>滚动/推进</th>
<th>透气/耐磨</th>
<th>舒适度</th>
<th>性价比</th>
<th>推荐理由</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Adidas Adizero EVO SL</td>
<td>98</td>
<td>209-213</td>
<td>39mm</td>
<td>高</td>
<td>高</td>
<td>动态推力</td>
<td>良好</td>
<td>顶级</td>
<td>高</td>
<td>超轻高缓震，前掌着地吸收冲击强，防扭脚最优，无板动态设计完美匹配重体重+公园路</td>
</tr>
<tr>
<td>2</td>
<td>李宁 赤兔9 PRO</td>
<td>97</td>
<td>190-200</td>
<td>高</td>
<td>高</td>
<td>高</td>
<td>前掌推进</td>
<td>极强</td>
<td>高</td>
<td>高</td>
<td>双密度轻弹+展翼支撑，轻量+稳，透气好，280km不衰，匹配你前掌+扭脚需求</td>
</tr>
<tr>
<td>3</td>
<td>安踏 C202 7代</td>
<td>96</td>
<td>212.9</td>
<td>85/双层氮</td>
<td>高</td>
<td>高</td>
<td>全域XL碳板</td>
<td>良好</td>
<td>高</td>
<td>高</td>
<td>碳板+氮中底，推进+稳，双重缓冲，性价比高，适合半马/长跑公园路</td>
</tr>
<tr>
<td>4</td>
<td>特步 160x 8.0pro</td>
<td>95</td>
<td>轻量</td>
<td>高</td>
<td>高</td>
<td>高</td>
<td>黄金碳板</td>
<td>良好</td>
<td>高</td>
<td>极高</td>
<td>碳板推进+软弹，轻量+稳，公园路吸收冲击强，性价比无敌</td>
</tr>
<tr>
<td>5</td>
<td>特步 两千公里5 Pro</td>
<td>94</td>
<td>轻量</td>
<td>高超临界</td>
<td>高</td>
<td>高</td>
<td>无板软弹</td>
<td>优秀</td>
<td>高</td>
<td>高</td>
<td>耐磨5000km+宽楦支撑，软弹吸收冲击，无板不易扭脚，堆量神器</td>
</tr>
<tr>
<td>6</td>
<td>特步 160x 3.0 / 5.0pro</td>
<td>93</td>
<td>轻量</td>
<td>高</td>
<td>高</td>
<td>高</td>
<td>异构碳板</td>
<td>良好</td>
<td>高</td>
<td>高</td>
<td>上一代碳板旗舰，轻量+推进+稳，性价比高，耐磨略逊8.0pro</td>
</tr>
<tr>
<td>7</td>
<td>Nike 迈柔18 非plus</td>
<td>92</td>
<td>~250</td>
<td>36/46mm</td>
<td>中</td>
<td>高</td>
<td>厚底</td>
<td>良好</td>
<td>顶级</td>
<td>高</td>
<td>超软弹舒适，但顶级缓震易过软，稳定性不如碳板，公园路扭脚风险中</td>
</tr>
<tr>
<td>8</td>
<td>安踏 二区心率 90</td>
<td>90</td>
<td>183-188</td>
<td>氮90+软弹</td>
<td>中</td>
<td>高</td>
<td>无板</td>
<td>良好</td>
<td>高</td>
<td>极高</td>
<td>软弹吸收冲击好，但无板易扭脚，适合纯有氧不推荐公园路</td>
</tr>
<tr>
<td>9</td>
<td>Adidas 波士顿13</td>
<td>89</td>
<td>252</td>
<td>6.3</td>
<td>7.6</td>
<td>7.6</td>
<td>好</td>
<td>良好</td>
<td>高</td>
<td>高</td>
<td>中性轻量，缓震+滚动好，但碳板弱，公园路稳定性一般</td>
</tr>
</tbody>
</table>
<h2>Summary</h2>
<p>根据下面提供的3个表格，其中 DeepSeek 权重 3，ChatGpt 权重2.5，Gork权重 1 来进行整合数据</p>
<p>权重越高越优先</p>
<p>下面按“<strong>权重越高越优先</strong>”整合：</p>
<ul>
<li><strong>综合优先级分 =（DeepSeek优先级×3 + ChatGPT排名×2.5 + Gork优先级×1）÷ 参与来源权重和</strong>，分数越低越优先。</li>
<li>缺失来源不参与该鞋款计算；Gork 的“特步 160x 3.0 / 5.0pro”为合并项，我同时映射到 5.0pro 与 3.0/3.0 PRO。</li>
<li>同分时，参考“加权评分”更高者优先。加权评分因各表评分尺度不同，仅作参考。</li>
</ul>
<h2>整合后综合排名</h2>
<table>
<thead>
<tr>
<th align="right">综合排名</th>
<th>鞋款</th>
<th align="right">DeepSeek 权重3优先级/评分</th>
<th align="right">ChatGPT 权重2.5排名/综合分</th>
<th align="right">Gork 权重1优先级/满分</th>
<th align="right">加权名次分↓</th>
<th align="right">加权评分↑</th>
<th>综合结论</th>
</tr>
</thead>
<tbody>
<tr>
<td align="right"><strong>1</strong></td>
<td><strong>李宁 赤兔9 PRO</strong></td>
<td align="right">2 / 88</td>
<td align="right">1 / 92</td>
<td align="right">2 / 97</td>
<td align="right"><strong>1.62</strong></td>
<td align="right"><strong>90.92</strong></td>
<td>三源均在前二，稳定与灵活兼备，综合最优先</td>
</tr>
<tr>
<td align="right"><strong>2</strong></td>
<td><strong>特步 两千公里5 Pro</strong></td>
<td align="right">1 / 92</td>
<td align="right">2 / 90</td>
<td align="right">5 / 94</td>
<td align="right"><strong>2.00</strong></td>
<td align="right"><strong>91.54</strong></td>
<td>DeepSeek第1、ChatGPT第2，宽楦+抗扭，堆量稳定首选</td>
</tr>
<tr>
<td align="right"><strong>3</strong></td>
<td><strong>安踏 C202 7代</strong></td>
<td align="right">6 / 68</td>
<td align="right">3 / 87</td>
<td align="right">3 / 96</td>
<td align="right"><strong>4.38</strong></td>
<td align="right">79.62</td>
<td>ChatGPT/Gork均第3，碳板推进强；DeepSeek认为稳定性一般</td>
</tr>
<tr>
<td align="right"><strong>4</strong></td>
<td><strong>Adidas 波士顿13</strong></td>
<td align="right">4 / 80</td>
<td align="right">4 / 85</td>
<td align="right">9 / 89</td>
<td align="right"><strong>4.77</strong></td>
<td align="right">83.31</td>
<td>后跟支撑扎实，前掌灵活，但足弓支撑偏弱</td>
</tr>
<tr>
<td align="right"><strong>5</strong></td>
<td><strong>Nike 迈柔18 非Plus</strong></td>
<td align="right">3 / 85</td>
<td align="right">7 / 77</td>
<td align="right">7 / 92</td>
<td align="right"><strong>5.15</strong></td>
<td align="right"><strong>83.00</strong></td>
<td>比Plus版更稳，但整体不是最优解</td>
</tr>
<tr>
<td align="right"><strong>6</strong></td>
<td><strong>特步 160x 5.0pro</strong></td>
<td align="right">5 / 72</td>
<td align="right">5 / 82</td>
<td align="right">6 / 93*</td>
<td align="right"><strong>5.15</strong></td>
<td align="right">79.08</td>
<td>碳板竞速中稳定性较强，但对脚踝力量要求高</td>
</tr>
<tr>
<td align="right"><strong>7</strong></td>
<td><strong>特步 160x 8.0pro</strong></td>
<td align="right">7 / 55</td>
<td align="right">6 / 80</td>
<td align="right">4 / 95</td>
<td align="right"><strong>6.15</strong></td>
<td align="right">70.77</td>
<td>Gork评价高，但DeepSeek认为稳定偏弱、低速慢跑生硬</td>
</tr>
<tr>
<td align="right"><strong>8</strong></td>
<td><strong>Adidas EVO SL</strong></td>
<td align="right">8 / 50</td>
<td align="right">9 / 70</td>
<td align="right">1 / 98</td>
<td align="right"><strong>7.31</strong></td>
<td align="right">65.08</td>
<td>Gork排第1，但DeepSeek/ChatGPT权重更高且排名低，综合不推荐</td>
</tr>
<tr>
<td align="right"><strong>9</strong></td>
<td><strong>特步 160X 3.0 / 3.0 PRO</strong></td>
<td align="right">未提及</td>
<td align="right">8 / 74</td>
<td align="right">6 / 93*</td>
<td align="right"><strong>7.43</strong></td>
<td align="right">79.43</td>
<td>偏性能，不建议为了“稳”去买</td>
</tr>
<tr>
<td align="right"><strong>10</strong></td>
<td><strong>安踏 二区心率 90</strong></td>
<td align="right">9 / 42</td>
<td align="right">未提及</td>
<td align="right">8 / 90</td>
<td align="right"><strong>8.75</strong></td>
<td align="right">54.00</td>
<td>中底软、足弓支撑弱，脚踝力量差者谨慎</td>
</tr>
</tbody>
</table></article>]]></content:encoded>
      <pubDate>Sat, 26 Sep 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-09-28T00:00:00.000Z</atom:updated>
      <category domain="category">重要决策</category>
      <category domain="tag">life</category>
      <category domain="tag">跑鞋</category>
      <category domain="tag">重要选择</category>
      <author>Marvel-L</author>
    </item>
    <item>
      <title><![CDATA[算法打卡冲刺 day2]]></title>
      <link>https://marvel-l.github.io/Blog/post/xiaolin_algo_week1_day2</link>
      <guid isPermaLink="true">https://marvel-l.github.io/Blog/post/xiaolin_algo_week1_day2</guid>
      <description><![CDATA[我能复刻的路吗]]></description>
      <content:encoded><![CDATA[<article><h1>203.移除链表元素</h1>
<p>力扣链接： <a href="https://leetcode.cn/problems/remove-linked-list-elements/submissions/" target="_blank" rel="noopener noreferrer">https://leetcode.cn/problems/remove-linked-list-elements/submissions/</a></p>
<p>题目： 给你一个链表和一个val，删除所有节点值等于val的节点，返回链表</p>
<h3>第一次</h3>
<pre><code class="hljs language-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">removeElements</span><span class="hljs-params">(head *ListNode, val <span class="hljs-type">int</span>)</span></span> *ListNode {
    cur := head 
    <span class="hljs-keyword">for</span>  ; cur != <span class="hljs-literal">nil</span> ; cur = cur.Next {
        <span class="hljs-keyword">if</span> cur.Val == val {
            <span class="hljs-keyword">if</span> cur.Next != <span class="hljs-literal">nil</span>  {
                cur.Next = cur.Next.Next
            }<span class="hljs-keyword">else</span> {
                cur = <span class="hljs-literal">nil</span> 
            }
        }
    }
    <span class="hljs-keyword">return</span> cur  
}
</code></pre>
<p>第一次 fail , 因为我们在 cur = nil 处理空的时候，当前的 cur.Next 会判断 Nil</p>
<p>然后我想着，我们是不是不需要这么额外处理 只需要处理 cur.Next = Cur.Next.Next 即可</p>
<pre><code class="hljs language-shell">panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x8 pc=0x4c398b]
main.removeElements(...)
solution.go, line 10
main.__helper__(...)
solution.go, line 25
main.main()
solution.go, line 66
</code></pre>
<h3>第二次</h3>
<p>第二次更改的时候 发现返回的结果都是 空</p>
<p>是因为 <mark>我返回的是Cur, 循环里 Cur != nil, 循环结束 Cur == nil</mark></p>
<pre><code class="hljs language-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">removeElements</span><span class="hljs-params">(head *ListNode, val <span class="hljs-type">int</span>)</span></span> *ListNode {
    cur := head 
    <span class="hljs-keyword">for</span>  ; cur != <span class="hljs-literal">nil</span> ; cur = cur.Next {
        <span class="hljs-keyword">if</span> cur.Val == val {
            <span class="hljs-keyword">if</span> cur.Next != <span class="hljs-literal">nil</span>  {
                cur.Next = cur.Next.Next
            }
        }    
    }
    <span class="hljs-keyword">return</span> cur  
}
</code></pre>
<h2>正确思路</h2>
<p>所以我们需要考虑 额外创建一个 结果 ListNode，然后通过 temp 指针进行处理</p>
<p>思路如下</p>
<p><mark>1. 创建一个 dummy 输出， 创建一个 prev 用于移动</mark>
<mark>2. 判断前驱节点 即 pre.next 是否为空, 判断是否到尾节点</mark>
<mark>3. 如果前驱节点 == val, 那么前驱节点指向下一个</mark>
<mark>4. 否则的话 保留当前节点，往前走动一个格</mark></p>
<pre><code class="hljs language-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">removeElements</span><span class="hljs-params">(head *ListNode, val <span class="hljs-type">int</span>)</span></span> *ListNode {
	dummy := &#x26;ListNode{Next: head}
	prev := dummy
	<span class="hljs-keyword">for</span> prev.Next != <span class="hljs-literal">nil</span> {
		<span class="hljs-keyword">if</span> prev.Next.Val == val {
			prev.Next = prev.Next.Next
		} <span class="hljs-keyword">else</span> {
			prev = prev.Next
		}
	}
	<span class="hljs-keyword">return</span> dummy.Next
}
</code></pre>
<h1>707.设计链表</h1>
<p>感觉有点困难 TBD</p>
<h1>206.反转链表</h1>
<p>力扣链接： <a href="https://leetcode.cn/problems/reverse-linked-list/" target="_blank" rel="noopener noreferrer">https://leetcode.cn/problems/reverse-linked-list/</a></p>
<p>题目： 给你一个链表，翻转一下，返回头节点</p>
<h2>思路</h2>
<p>对于链表操作不太熟悉，遍历的时候 喜欢使用 <mark>cur = cur.Next 进行遍历</mark></p>
<p>导致我尝试使用 <mark>cur.Next = prev</mark> 操作的时候不太好进行操作</p>
<p>这里我们可以尝试将 <mark><code>next = cur.next</code></mark> 记录下来，然后再将节点更改，然后再移动到下一个节点</p>
<pre><code class="hljs language-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">reverseList</span><span class="hljs-params">(head *ListNode)</span></span> *ListNode {
    <span class="hljs-keyword">var</span> prev *ListNode 
    cur := head 

    <span class="hljs-keyword">for</span> cur != <span class="hljs-literal">nil</span> {
        next := cur.Next
        cur.Next = prev
        prev = cur
        cur = next
    }
    <span class="hljs-keyword">return</span> prev
}
</code></pre>
<h1>24. 两两交换链表中的节点</h1>
<p>力扣链接：<a href="https://leetcode.cn/problems/swap-nodes-in-pairs/" target="_blank" rel="noopener noreferrer">https://leetcode.cn/problems/swap-nodes-in-pairs/</a></p>
<p>题目：给你一个链表，每两个节点，进行交换。比如 1-2-3-4。 改为 2-1-4-3</p>
<h2>第一次</h2>
<pre><code class="hljs language-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">swapPairs</span><span class="hljs-params">(head *ListNode)</span></span> *ListNode {
    cnt := <span class="hljs-number">0</span> 

    cur :=  head 
    <span class="hljs-keyword">var</span> last *ListNode
    <span class="hljs-keyword">for</span> cur != <span class="hljs-literal">nil</span> {
        cnt ++ 
        next := cur.Next <span class="hljs-comment">// 记录一下一次操作</span>

        <span class="hljs-keyword">if</span> cnt % <span class="hljs-number">2</span> == <span class="hljs-number">0</span> {
            cur.Next = last 
            last.Next = next
        }
        last = cur 
        cur = next 
    }
    
    <span class="hljs-keyword">return</span> head 
}
</code></pre>
<pre><code class="hljs language-golang"><span class="hljs-keyword">type</span> MyLinkedList <span class="hljs-keyword">struct</span> { 
 	 Val <span class="hljs-type">int</span> 
 	 Next *MyLinkedList 
 	 Len <span class="hljs-type">int</span> 
 } 
 
 
 <span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">Constructor</span><span class="hljs-params">()</span></span> MyLinkedList { 
 	 <span class="hljs-keyword">return</span> MyLinkedList{ 
 	 	 Val: <span class="hljs-number">0</span>, 
 	 	 Next: <span class="hljs-literal">nil</span>, 
 	 } 
 } 
 
 
 <span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-params">(this *MyLinkedList)</span></span> Get(index <span class="hljs-type">int</span>) <span class="hljs-type">int</span> { 
 	 <span class="hljs-keyword">if</span> index  + <span class="hljs-number">1</span>  > this.Len { 
 	 	 <span class="hljs-keyword">return</span> <span class="hljs-number">-1</span> 
 	 } 
 	 cnt := <span class="hljs-number">0</span> 
 
 	 <span class="hljs-keyword">for</span>  cur := this ; cur != <span class="hljs-literal">nil</span> ; cur = cur.Next { 
 	 	 <span class="hljs-keyword">if</span> cnt == index { 
 	 	 	 <span class="hljs-keyword">return</span> cur.Val 
 	 	 } 
 	 	 cnt ++ 
 	 } 
 	 <span class="hljs-keyword">return</span> <span class="hljs-number">0</span> 
 } 
 
 
 <span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-params">(this *MyLinkedList)</span></span> AddAtHead(val <span class="hljs-type">int</span>)  { 
 	 newLinkedList := &#x26;MyLinkedList{ 
 	 	 Val: val, 
 	 } 
 	 newLinkedList.Next = this 
 	 newLinkedList.Len = this.Len + <span class="hljs-number">1</span> 
 	 this = newLinkedList 
 } 
 
 
 <span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-params">(this *MyLinkedList)</span></span> AddAtTail(val <span class="hljs-type">int</span>)  { 
 	 tail := this.Get(this.Len - <span class="hljs-number">1</span>) <span class="hljs-comment">// 获取末尾 </span>
 	 this.AddAtIndex(this.Len - <span class="hljs-number">1</span>, val) <span class="hljs-comment">// 插入在末尾前 </span>
 	 this.DeleteAtIndex(this.Len - <span class="hljs-number">1</span>) <span class="hljs-comment">// 删除末尾 </span>
 	 this.AddAtIndex(this.Len - <span class="hljs-number">1</span>, tail) <span class="hljs-comment">// 插入在末尾前 </span>
 } 
 
 
 <span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-params">(this *MyLinkedList)</span></span> AddAtIndex(index <span class="hljs-type">int</span>, val <span class="hljs-type">int</span>)  { 
 	 <span class="hljs-keyword">if</span> index > this.Len { 
 	 	 <span class="hljs-keyword">return</span> 
 	 } 
 	 <span class="hljs-keyword">if</span> index == <span class="hljs-number">0</span> { 
 	 	 this.AddAtHead(val) 
 	 } 
 	 dummy := &#x26;MyLinkedList{Next:this} 
 	 prev := dummy 
 	 cnt := <span class="hljs-number">0</span> 
 	 <span class="hljs-keyword">for</span> prev.Next != <span class="hljs-literal">nil</span> { 
 	 	 <span class="hljs-keyword">if</span> cnt - <span class="hljs-number">1</span> == index { 
 	 	 	 <span class="hljs-built_in">new</span> := &#x26;MyLinkedList{Val:val} 
 	 	 	 <span class="hljs-built_in">new</span>.Next = prev.Next 
 	 	 	 prev.Next = <span class="hljs-built_in">new</span> 
 	 	 } 
 	 	 prev = prev.Next <span class="hljs-comment">// 1->2 </span>
 	 	 cnt ++ 
 	 } 
 	 this = dummy.Next 
 } 
 
 
 <span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-params">(this *MyLinkedList)</span></span> DeleteAtIndex(index <span class="hljs-type">int</span>)  { 
 	 <span class="hljs-keyword">if</span> index > this.Len { 
 	 	 <span class="hljs-keyword">return</span> 
 	 } 
 	 <span class="hljs-keyword">if</span> index == <span class="hljs-number">0</span> { 
 	 	 this = this.Next 
 	 } 
 
 	 cur := this 
 	 cnt := <span class="hljs-number">0</span> 
 	 <span class="hljs-keyword">for</span> cur != <span class="hljs-literal">nil</span> { 
 	 	 cur  = cur.Next 
 	 	 cnt ++ 
 	 	 <span class="hljs-keyword">if</span> cnt == index { <span class="hljs-comment">// 上一个 </span>
 	 	 	 cur.Next = cur.Next.Next 
 	 	 } 
 	 } 
 } 
 

</code></pre>
<p>修正后</p>
<pre><code class="hljs language-go"><span class="hljs-keyword">type</span> Node <span class="hljs-keyword">struct</span> {
	Val  <span class="hljs-type">int</span>
	Next *Node
}

<span class="hljs-keyword">type</span> MyLinkedList <span class="hljs-keyword">struct</span> {
	head *Node
	size <span class="hljs-type">int</span>
}

<span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">Constructor</span><span class="hljs-params">()</span></span> MyLinkedList {
	<span class="hljs-keyword">return</span> MyLinkedList{}
}

<span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-params">(this *MyLinkedList)</span></span> Get(index <span class="hljs-type">int</span>) <span class="hljs-type">int</span> {
	<span class="hljs-keyword">if</span> index &#x3C; <span class="hljs-number">0</span> || index >= this.size {
		<span class="hljs-keyword">return</span> <span class="hljs-number">-1</span>
	}
	cur := this.head
	<span class="hljs-keyword">for</span> i := <span class="hljs-number">0</span>; i &#x3C; index; i++ {
		cur = cur.Next
	}
	<span class="hljs-keyword">return</span> cur.Val
}

<span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-params">(this *MyLinkedList)</span></span> AddAtHead(val <span class="hljs-type">int</span>) {
	this.head = &#x26;Node{
		Val:  val,
		Next: this.head,
	}
	this.size++
}

<span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-params">(this *MyLinkedList)</span></span> AddAtTail(val <span class="hljs-type">int</span>) {
	this.AddAtIndex(this.size, val)
}

<span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-params">(this *MyLinkedList)</span></span> AddAtIndex(index <span class="hljs-type">int</span>, val <span class="hljs-type">int</span>) {
	<span class="hljs-keyword">if</span> index &#x3C; <span class="hljs-number">0</span> {
		index = <span class="hljs-number">0</span>
	}
	<span class="hljs-keyword">if</span> index > this.size {
		<span class="hljs-keyword">return</span>
	}
	<span class="hljs-keyword">if</span> index == <span class="hljs-number">0</span> {
		this.AddAtHead(val)
		<span class="hljs-keyword">return</span>
	}

	prev := this.head
	<span class="hljs-keyword">for</span> i := <span class="hljs-number">0</span>; i &#x3C; index<span class="hljs-number">-1</span>; i++ {
		prev = prev.Next
	}
	prev.Next = &#x26;Node{
		Val:  val,
		Next: prev.Next,
	}
	this.size++
}

<span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-params">(this *MyLinkedList)</span></span> DeleteAtIndex(index <span class="hljs-type">int</span>) {
	<span class="hljs-keyword">if</span> index &#x3C; <span class="hljs-number">0</span> || index >= this.size {
		<span class="hljs-keyword">return</span>
	}
	<span class="hljs-keyword">if</span> index == <span class="hljs-number">0</span> {
		this.head = this.head.Next
		this.size--
		<span class="hljs-keyword">return</span>
	}

	prev := this.head
	<span class="hljs-keyword">for</span> i := <span class="hljs-number">0</span>; i &#x3C; index<span class="hljs-number">-1</span>; i++ {
		prev = prev.Next
	}
	prev.Next = prev.Next.Next
	this.size--
}
</code></pre></article>]]></content:encoded>
      <pubDate>Sat, 26 Sep 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-09-28T00:00:00.000Z</atom:updated>
      <category domain="category">算法</category>
      <category domain="tag">日常</category>
      <category domain="tag">我的来时路</category>
      <author>Marvel-L</author>
    </item>
    <item>
      <title><![CDATA[26年中秋 - 记录这一天]]></title>
      <link>https://marvel-l.github.io/Blog/post/26-%E4%B8%AD%E7%A7%8B-%E8%AE%B0%E5%BD%95%E4%B8%80%E6%AC%A1%E8%BF%90%E5%8A%A8</link>
      <guid isPermaLink="true">https://marvel-l.github.io/Blog/post/26-%E4%B8%AD%E7%A7%8B-%E8%AE%B0%E5%BD%95%E4%B8%80%E6%AC%A1%E8%BF%90%E5%8A%A8</guid>
      <description><![CDATA[什么都没改变 但是我感觉我存在]]></description>
      <content:encoded><![CDATA[<article><h1>22:27 的感想</h1>
<p>今天发生了很多事，唯独没有学习，明明什么都没有改变，但是我感觉到了我的存在</p>
<h1>早上</h1>
<p>早上起来其实还是很焦虑的, 因为上班的这三天确实没学到什么东西，或者说没感觉学会什么东西</p>
<p>但是我其实有一个 <strong>疑问</strong></p>
<p><mark>我其实渴望的是有人带我, Leader 或者是其他同事，但是其实有一个问题就是，我的前Leader来公司的时候，他又是谁带的呢</mark></p>
<p>Leader 的上级只有产品经理和CTO，那么他也没人带，他只能自己读代码，自己看文档，自己体验系统 。</p>
<p>我上家公司有几个特点</p>
<ol>
<li>代码比较统一 前端后端代码在一起，容易从接口找到对应的实现</li>
<li>系统比较统一 系统就只有 stage preprod prod 线上 等环境，而且功能比较通俗易懂</li>
<li>文档很少，或者说几乎没有</li>
</ol>
<p>我当前这家公司有几个特点</p>
<ol>
<li>仅仅只有后端代码，前端代码不知道在哪个项目 我也找不到 只能找到后端接口</li>
<li>系统换进很多，什么 BOE 、stable、新加坡，plus 啥的好像有8个环境，每个环节都需要单独申请，也没有对应的URL访问</li>
<li>文档很多，多到杂乱无章</li>
</ol>
<p>所以我Leader是怎么学习的，他也没人带啊，为什么我不能学习，为什么我学不会呢，我感觉我应该也要学会 ？</p>
<p>所以早上其实压力很大，本来计划学习3天的，但是早上起来的时候拉肚子了，我感觉是吃鸭腿饭拉的肚子</p>
<p>昨天没设置闹钟，今天不是 8:30 起来的，而是 9:00 肚子闹醒的，特别拉肚子</p>
<p>拉肚子之后，然后回床上躺着，躺着很舒服，躺到了 10:30左右吧，然后开始点早饭</p>
<p>今天不知道是压力大还是不开心，早上点了两份饭</p>
<ol>
<li>一份是过桥米线</li>
<li>一份是小笼包10个+混沌</li>
</ol>
<div data-role="markdown-image-row" class="markdown-image-row"><img src="https://marvel-l.github.io/Blog/breakfast_0x01.jpg" alt="早饭_0x01" class="inline"> <img src="https://marvel-l.github.io/Blog/breakfast_0x02.jpg" alt="早饭_0x02" class="inline"></div>
<p>吃完过桥米线就吐了，因为保持体重，不得不说，我喜欢这种吃了就吐的感觉</p>
<p>然后吃小笼包+混沌。北京这里的小笼包谈不上难吃，但是也没有好吃到哪里去，不过我喜欢面泡汤的感觉 非常好吃</p>
<p>吃完之后，然后就躺床上 和 女朋友聊天了</p>
<p>哦 然后途中又起来吃了两个鸭腿，然后又吐掉了 期间还吃了一个玉米</p>
<div data-role="markdown-image-row" class="markdown-image-row"><img src="https://marvel-l.github.io/Blog/breakfast_0x03.jpg" alt="早饭_0x03" class="inline"> <img src="https://marvel-l.github.io/Blog/breakfast_0x04.jpg" alt="早饭_0x04" class="inline"></div>
<p>聊天，睡觉，刷抖音</p>
<p>我 12:00 左右定了一个计划，就是清理一下我抖音的点赞 大概4000多个视频</p>
<p>我之前都有一个习惯就是 定期清理点赞的内容 要么取消点赞 要么移步到收藏。但是最近找工作太忙，加上其他事情</p>
<p>导致我的喜欢暴涨了，我约定是看到 13:00 。结果看到 12:30 其实就没看进去了</p>
<p>因为我发现 我确实 这几个视频都是我喜欢看的，但是他又没有那么值得进收藏，所以就没什么兴趣继续看了</p>
<h1>下午</h1>
<p>13:00 睡觉，本来想要睡个 20分钟的，但是眼睛一闭 各种想法从脑海里面冒出来</p>
<p>例如 “某个学弟或者是朋友 保研啊 找到好工作什么的”“北京为什么这么烂”“我的下一份工作怎么办”“我跟我女朋友的未来怎么办”</p>
<p>然后没睡着，大概继续刷抖音到了14:00左右 洗了个头</p>
<p>然后打算出门，我前几天买的单肩包很好背，我本来只是打算出门买个瑞幸喝的，因为我女朋友今天生理期 在中午喝了奶茶 所以我想着我也喝点</p>
<p>洗了个头，然后穿个衣服背个包出去了</p>
<div data-role="markdown-image-row" class="markdown-image-row"><img src="https://marvel-l.github.io/Blog/diulaji.jpg" alt="丢垃圾" class="inline"> <img src="https://marvel-l.github.io/Blog/bag.png" alt="包" class="inline"> <img src="https://marvel-l.github.io/Blog/laji.png" alt="垃圾" class="inline"></div>
<p>一走出门 突然就想吃个雪糕，因为之前来北京的时候 看到过好几个没见过的雪糕，正好今天节日 正好去买</p>
<p>买了一个 巧克力的雪糕 5 块钱，还买了一包呀土豆，和香肠 打算去旁边的公园 坐着 。然后去拿我的瑞幸</p>
<p>在公园坐着 1个小时，很爽，一天最爽的时候了</p>
<p>下午有太阳，公园，吃零食，和女朋友聊天，没有蚊子也不算很热</p>
<p>本来想再坐会的，但是16:30左右没太阳了 太冷了，而且蚊子也出来了</p>
<p>然后我就回去了</p>
<h2>晚上</h2>
<p>回去的时候 点了一份鸡公煲， 和女朋友聊天的时候 不小心水洒到笔记本上了 不过还好我是 MAC 笔记本放水</p>
<p>鸡公煲不算特别好吃，但是也要20+，北京的外卖就是这么贵</p>
<div data-role="markdown-image-row" class="markdown-image-row"><img src="https://marvel-l.github.io/Blog/jigongbao.png" alt="鸡公煲" class="inline"> <img src="https://marvel-l.github.io/Blog/water_mac.png" alt="水电脑" class="inline"></div>
<p>下午的时候 我记得我坐了40个哑铃弯举</p>
<p>吃完饭 刷了会抖音，期间刷了5个算法题，都是比较简单的 <a href="https://my.feishu.cn/wiki/Ems8wKdzMiF7vfkyIFxcfLihnth" target="_blank" rel="noopener noreferrer">算法题单</a></p>
<p>题目来源于 我购买的一个后端训练营的 算法打卡内容，不是按类别进行分类的，而是按照周和天出的题</p>
<p>断断续续大概刷了1个小时 涉及 暴力模拟、快慢指针、滑动窗口、二分什么的，都是为了处理面试的</p>
<p>然后晚上休息了一个小时 出去跑步了，今天就是想跑所以去跑了，因为今天除了去公园走走还没什么运动</p>
<p>而且我想看看那个公园晚上能不能跑步，毕竟我想知道我下班后还能不能运动，如果不行的话 可能需要找另外一个路线了</p>
<p>没想到竟然可以跑步，而且配速还能接受，我感觉我配速可能慢到 8分配了，因为担心崴脚，，可是实际还是在 6分配的范围</p>
<p>跑完步，我母亲突然找我，问我一些家常，然后我和女朋友吐槽了5分钟</p>
<p>说什么我母亲自私，没有在我需要她的时候 给予关怀，我现在不需要了又来嘘寒问暖。 而且给一些傻逼都知道的话 例如 不要去跑太黑的地方，吃饭没有，放假几天什么的</p>
<p>我反正对我父母没什么好感，我无非是他们生出来养儿防老的工具，可是说实话 为什么是我，为什么是我来吃这个苦，如果我家有钱，我可以养儿防老，但是为什么没钱还要帮你们养老</p>
<p>跑完步之后回去洗澡，洗衣服</p>
<p>和女朋友打视频，打完之后又和我母亲打视频</p>
<p>因为她说她明天有空给我打，我并不想明天空出某一些时间跟她扯什么话，所以我洗完澡就给她打了，这次没说什么</p>
<p>就说 “一个人在北京有没有钱”“累不累”什么的，至于那些家常 和 什么时候结婚，多存钱什么的话 倒是没说 。而且说了一些欣慰的话 例如 <mark>“我也没什么好说的，那些常说的话 你也听烦了我就不说了”</mark></p>
<p>挺好的，然后我就挂了电话 。 继续和女朋友打视频</p>
<p>后面又做了一组无氧，然后上了个厕所，写了一下题解，随便看了一下抖音什么的 ，23:00之后开始写我这篇日记，同时优化一下我的这个项目的内容</p>
<div data-role="markdown-image-row" class="markdown-image-row"><img src="https://marvel-l.github.io/Blog/img_1.png" alt="img_1.png" class="inline"> <img src="https://marvel-l.github.io/Blog/img.png" alt="img.png" class="inline"></div>
<h1>总结</h1>
<p>从课题分离的角度看 我今天既没有在股市赚钱 也没有在 学习方面努力 理论上来说 我是悲观的一天</p>
<p>但是 我下午在公园吃零食，晚上跑步 然后和 父母沟通 同时今天还和女朋友打视频打了很久 说了很多，而且今天还不用上班</p>
<p>我感觉 我至少存在了某一段时间，这就是我，我感觉很爽，或许这就是生活的意义</p></article>]]></content:encoded>
      <pubDate>Fri, 25 Sep 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-09-28T00:00:00.000Z</atom:updated>
      <category domain="category">日常</category>
      <category domain="tag">日常</category>
      <author>Marvel-L</author>
    </item>
    <item>
      <title><![CDATA[算法打卡冲刺 day1]]></title>
      <link>https://marvel-l.github.io/Blog/post/xiaolin_algo_week1_day1</link>
      <guid isPermaLink="true">https://marvel-l.github.io/Blog/post/xiaolin_algo_week1_day1</guid>
      <description><![CDATA[我能复刻的路吗]]></description>
      <content:encoded><![CDATA[<article><h1>704.二分查找</h1>
<p>力扣链接：<a href="https://leetcode.cn/problems/binary-search/" target="_blank" rel="noopener noreferrer">https://leetcode.cn/problems/binary-search/</a></p>
<p>题目：给你一个升序数组 nums 和一个目标值 target ，返回目标值 target 在数组 nums 中的下标，如果不存在则返回-1</p>
<h2>思路</h2>
<p>标准的二分查找，可以直接通过 左区间 或者是 右区间的方式找出来</p>
<h2>问题</h2>
<p>一开始 Code 写错了，我在区间移动的时候 认为 如果答案在 <code>nums[mid] >= target</code> 的时候 那么答案肯定在 左边，因为左边有相等</p>
<p>所以这时候 我就直接 <code>l = mid</code> 但是有一个问题就是，如果 <mark>第一次计算出来的答案比他小，那么 r = mid - 1</mark> 永远也计算不出来答案</p>
<p>所以我尝试把思路转变成 ，求 小于等于的第一个数， 保证在区间第一次缩小的时候能够正确缩小</p>
<pre><code class="hljs language-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">search</span><span class="hljs-params">(nums []<span class="hljs-type">int</span>, target <span class="hljs-type">int</span>)</span></span> <span class="hljs-type">int</span> {
    l := <span class="hljs-number">0</span> 
    r := <span class="hljs-built_in">len</span>(nums) - <span class="hljs-number">1</span>
    <span class="hljs-keyword">for</span> l &#x3C; r {
        mid := (l+r+<span class="hljs-number">1</span>)>><span class="hljs-number">1</span> 
        <span class="hljs-keyword">if</span> nums[mid] >= target {
            l = mid 
        }<span class="hljs-keyword">else</span> {
            r = mid - <span class="hljs-number">1</span>; 
        }
    } 
    <span class="hljs-keyword">if</span> nums[l] == target {
        <span class="hljs-keyword">return</span> l ;
    }<span class="hljs-keyword">else</span> {
        <span class="hljs-keyword">return</span> <span class="hljs-number">-1</span>;
    }
} 
</code></pre>
<h2>Code</h2>
<pre><code class="hljs language-go">  <span class="hljs-keyword">for</span> l &#x3C; r {
        mid := (l+r+<span class="hljs-number">1</span>)>><span class="hljs-number">1</span> 
        <span class="hljs-keyword">if</span> nums[mid] &#x3C;= target {
            l = mid 
        }<span class="hljs-keyword">else</span> {
            r = mid - <span class="hljs-number">1</span>; 
        }
    } 
</code></pre>
<h1>27. 移除元素</h1>
<p>力扣链接：<a href="https://leetcode.cn/problems/remove-element/%E2%80%8B" target="_blank" rel="noopener noreferrer">https://leetcode.cn/problems/remove-element/​</a></p>
<p>题目：给你一个数组 nums 和一个值 val，要求你把数组中值为 val 的元素全部删掉，而且不允许你使用额外的数组来辅助解决这题，返回移除 val 后数组的长度</p>
<h2>问题</h2>
<p>一开始思路便 ，我以为是移动元素到后面，而且我还一直在纠结 <mark>如何不使用额外空间进行移动</mark> ,所以一直在纠结 <code>[val,val , 1,2,3]</code> 的情况</p>
<p>但是题目要求并不是移动到后面，而是只需要保证前 <code>k</code> 个不包含几个</p>
<h2>思路</h2>
<p>使用快慢指针，对于慢指针，当快指针扫过<code>val</code>的时候 慢指针停止移动，下次快指针进行更新</p>
<h2>Code</h2>
<pre><code class="hljs language-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">removeElement</span><span class="hljs-params">(nums []<span class="hljs-type">int</span>, val <span class="hljs-type">int</span>)</span></span> <span class="hljs-type">int</span> {
    fi := <span class="hljs-number">0</span> 
    n := <span class="hljs-built_in">len</span>(nums)
    <span class="hljs-keyword">for</span> i := <span class="hljs-number">0</span> ; i &#x3C; n ; i ++  {
        <span class="hljs-keyword">if</span> nums[i] != val {
            nums[fi] = nums[i]
            fi ++ 
        }
    }
    <span class="hljs-keyword">return</span> fi 
}
</code></pre>
<h1>977.有序数组的平方</h1>
<p>力扣链接： <a href="https://leetcode.cn/problems/squares-of-a-sorted-array/" target="_blank" rel="noopener noreferrer">https://leetcode.cn/problems/squares-of-a-sorted-array/</a></p>
<p>题目： 给你一个递增数组 nums（包含负数），返回一个数组，且数组要求里面的元素是给定数组 nums 里面元素的平方，还要求递增</p>
<h2>思路</h2>
<p>这题之前做过有印象，因为原数组就是排序之后的数组，所以我们通过 左右指针，即可保证 正负的最大值判断</p>
<p>但是在插入的时候有问题，因为我们要求是从小到大的输出的。 因为 <mark>如果我们顺序插入会导致乱序</mark> ，因为我们并不能保证当前的两个极大值一定是最小值</p>
<p>因此需要考虑反向插入</p>
<h2>Code</h2>
<pre><code class="hljs language-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">sortedSquares</span><span class="hljs-params">(nums []<span class="hljs-type">int</span>)</span></span> []<span class="hljs-type">int</span> {
    l , r := <span class="hljs-number">0</span>, <span class="hljs-built_in">len</span>(nums) - <span class="hljs-number">1</span>
    
    res := <span class="hljs-built_in">make</span>([]<span class="hljs-type">int</span> ,<span class="hljs-built_in">len</span>(nums))

    k := <span class="hljs-number">0</span> 
    <span class="hljs-keyword">for</span> ; l &#x3C;= r ; {
        lv := nums[l] * nums[l]
        lr := nums[r] * nums[r] 
        <span class="hljs-keyword">if</span> lv &#x3C; lr {
            res[k] = lv 
            l ++ 
         }<span class="hljs-keyword">else</span> {
            res[k] = lr
            r -- 
         }
         k ++ 
    }
    <span class="hljs-keyword">return</span> res 
} 
</code></pre>
<h1>209.长度最小的子数组</h1>
<p>力扣链接：<a href="https://leetcode.cn/problems/minimum-size-subarray-sum/" target="_blank" rel="noopener noreferrer">https://leetcode.cn/problems/minimum-size-subarray-sum/</a></p>
<p>题目：给你一个数组和 target，求出一个连续子数组，并且这个子数组相加要大于 target，返回子数组最短的长度</p>
<h2>思路</h2>
<p>一眼就能看出解法的题目，需要使用滑动窗口，或者说每次能够 >= target 的时候 需要维护一个左指针 保证最小区间</p>
<p>但是这里有一个问题就是我们是 <code>ans >= target</code> 的时候需要计算 而不是 <code>ans > target</code> 一开始写这个题目的时候 还是有很多卡点</p>
<h2>Code</h2>
<pre><code class="hljs language-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">minSubArrayLen</span><span class="hljs-params">(target <span class="hljs-type">int</span>, nums []<span class="hljs-type">int</span>)</span></span> <span class="hljs-type">int</span> {
    n := <span class="hljs-built_in">len</span>(nums)

    ans := <span class="hljs-number">0</span> 
    l := <span class="hljs-number">0</span> 
    res := n 
    find := <span class="hljs-literal">false</span> 
    <span class="hljs-keyword">for</span> i := <span class="hljs-number">0</span> ; i &#x3C; n ; i ++ {
        ans += nums[i]
        <span class="hljs-comment">// 1 -></span>
        <span class="hljs-comment">// 1 + 4 -> (5 - 1) -> (l = 1, i = 1)</span>
        <span class="hljs-keyword">for</span> ans - nums[l] >= target {
            ans -= nums[l]
            l ++ 
        }

        <span class="hljs-keyword">if</span> ans >= target {
            res = min(res, i - l + <span class="hljs-number">1</span>)
            find = <span class="hljs-literal">true</span> 
        }
    }

    <span class="hljs-keyword">if</span> !find {
        <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>
    }

    <span class="hljs-keyword">return</span> res 

</code></pre>
<h2>5. 螺旋矩阵II</h2>
<p>力扣链接： <a href="https://leetcode.cn/problems/spiral-matrix-ii/" target="_blank" rel="noopener noreferrer">https://leetcode.cn/problems/spiral-matrix-ii/</a></p>
<p>题目： 给你一个n，生成NxN的矩阵，并且要求你顺时针填入 1，2，3，4，5...</p>
<h2>思路</h2>
<p>单纯的模拟，没有什么优化空间， 一开始以为是构造，是个什么数学公式</p>
<p>但是发现就算数学公式，<mark>你也需要 n^2 的时间复杂度</mark> 进行补充数据</p>
<p>所以我们只能通过 模拟，模拟 n^2 次行为，当我们走到边界的时候尝试进行转向</p>
<h2>Code</h2>
<pre><code class="hljs language-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">generateMatrix</span><span class="hljs-params">(n <span class="hljs-type">int</span>)</span></span> [][]<span class="hljs-type">int</span> {
    dx := []<span class="hljs-type">int</span>{<span class="hljs-number">0</span>,<span class="hljs-number">1</span>,<span class="hljs-number">0</span>,<span class="hljs-number">-1</span>}
    dy := []<span class="hljs-type">int</span>{<span class="hljs-number">1</span>,<span class="hljs-number">0</span>,<span class="hljs-number">-1</span>,<span class="hljs-number">0</span>}

	res := <span class="hljs-built_in">make</span>([][]<span class="hljs-type">int</span>, n)
	<span class="hljs-keyword">for</span> i := <span class="hljs-number">0</span>; i &#x3C; n; i++ {
		res[i] = <span class="hljs-built_in">make</span>([]<span class="hljs-type">int</span>, n)
	}

    cur := <span class="hljs-number">1</span> 
    x , y := <span class="hljs-number">0</span> , <span class="hljs-number">0</span> 
    k := <span class="hljs-number">0</span>
    <span class="hljs-keyword">for</span> i := <span class="hljs-number">0</span> ; i &#x3C; n * n ; i ++  {
        res[x][y] = cur 
        cur ++ 
        tx , ty := x + dx[k],y + dy[k]
        <span class="hljs-keyword">if</span> tx >= n ||tx &#x3C; <span class="hljs-number">0</span> ||  ty >= n || ty  &#x3C; <span class="hljs-number">0</span> ||  res[tx][ty] != <span class="hljs-number">0</span> {
            k = (k  + <span class="hljs-number">1</span>) %<span class="hljs-number">4</span> <span class="hljs-comment">// 顺时针</span>
        }
        x += dx[k] 
        y += dy[k]
    }
    <span class="hljs-keyword">return</span> res 
}
</code></pre></article>]]></content:encoded>
      <pubDate>Fri, 25 Sep 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-09-28T00:00:00.000Z</atom:updated>
      <category domain="category">算法</category>
      <category domain="tag">日常</category>
      <category domain="tag">我的来时路</category>
      <author>Marvel-L</author>
    </item>
    <item>
      <title><![CDATA[[Yuean] 入职第三天]]></title>
      <link>https://marvel-l.github.io/Blog/post/yuean-inner-job-0x03</link>
      <guid isPermaLink="true">https://marvel-l.github.io/Blog/post/yuean-inner-job-0x03</guid>
      <description><![CDATA[持续崩溃中]]></description>
      <content:encoded><![CDATA[<article><h1>现有的问题</h1>
<ol>
<li>Leader 属于放养的状态</li>
<li>项目主流程走不通</li>
<li>甚至找不到业务前端界面，不能从业务出发 然后找到对应的 Rest 页面从而找到对应的代码</li>
<li>整个业务内容太大了</li>
</ol>
<h1>解决 (分而治之)</h1>
<p>先根据 <a href="https://bytedance.larkoffice.com/wiki/SY5ewnA1GiV43XkK225cJTQsnfe" target="_blank" rel="noopener noreferrer">LTC(系统新人文档)</a> 看了一下我们系统的相关模块</p>
<p>根据文档中的 系统地址，尝试进行一些 业务操作的熟悉</p>
<pre><code>系统地址
- 商品：https://noah-b.bytedance.net/comm/commodity/product
- 报价：https://quote.sre-boe.bytedance.net/quote-list
- CRM：https://eps-crm-boe.bytedance.net/quote/list
</code></pre>
<h2>一些问题</h2>
<p>对于 <strong>报价</strong> 系统，访问的时候表示没有权限，昨天询问 Leader 的时候，说我不负责这个模块，我先 SKIP 了</p>
<p>然后我尝试去访问 CRM 页面，因为商品页面也不是我负责的</p>
<h3>CRM 问题</h3>
<ol>
<li>访问 CRM 创建合同流程的时候 页面空白 也没有权限报错</li>
<li>访问在线协同合同的时候 页面 404</li>
</ol>
<p>没有什么比较好的 IDEA 直接去问了 ，第一天入职的时候 Leader @带我的负责人</p>
<p>负责人叫我询问 CRM 相关的开发同学，询问后暂时无果</p>
<p><img src="https://marvel-l.github.io/Blog/crm_blank.png" alt="crm_blank"> <img src="https://marvel-l.github.io/Blog/crm_404.png" alt="crm_404"></p>
<p>后续 :</p>
<p>给我提供了一个 New 360 版本的平台，但是给我开通的权限是 直销 权限</p>
<p>没有看到创建合同 和 合同流程 的操作。</p>
<p>没什么想法 感觉更复杂了</p>
<p><a href="https://c360-boe.bytedance.net/opportunity/list?relationType=true" target="_blank" rel="noopener noreferrer">CRM_360</a></p>
<p><img src="https://marvel-l.github.io/Blog/crm_360.png" alt="crm_360"></p>
<h4>名词解释</h4>
<p>CRM (Creator Recommendation Matchmaking) 达人定向货盘推荐系统，仅 TikTok 内部使用</p>
<p>实际体验下来感觉是一个多纬的后台管理系统</p>
<p>包括管理 (商机、管理报价、管理合同、管理客户)</p>
<p>看着是一个 面向销售 或者是 客户成功 这一类的人使用的</p>
<p>看不懂还是看不懂，我该怎么入门，应该怎么看 。。。。。。。。。。。。。。。。。。。。。。。。。。。。</p>
<p>怎么办怎么办，我的人生完蛋了</p></article>]]></content:encoded>
      <pubDate>Thu, 24 Sep 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-09-28T00:00:00.000Z</atom:updated>
      <category domain="category">日常</category>
      <category domain="tag">日常</category>
      <category domain="tag">我的第二份工作</category>
      <author>Marvel-L</author>
    </item>
    <item>
      <title><![CDATA[[Yuean] 入职第二天]]></title>
      <link>https://marvel-l.github.io/Blog/post/yuean-inner-job-0x02</link>
      <guid isPermaLink="true">https://marvel-l.github.io/Blog/post/yuean-inner-job-0x02</guid>
      <description><![CDATA[持续崩溃中]]></description>
      <content:encoded><![CDATA[<article><h1>写在前头</h1>
<p>我昨天入职了，昨天忙了一天今天理论上来说应该是安稳学习，走完新人学习文档的一天</p>
<p>按照我上家公司的流程 今天应该是简单开发一些内容跑通一个主流程</p>
<h1>我的规划</h1>
<ol>
<li>就像走一下新人文档</li>
<li>更改代码中的一行日志 走一次开发-自测-PR 主流程</li>
</ol>
<h2>问题</h2>
<ol>
<li>我看新人文档的时候遇到了一大堆问题</li>
</ol>
<p>各种历史旧文档没内容，没权限，各种名词各种逻辑乱跳</p>
<ol start="2">
<li>然后我就去走开发主流程</li>
</ol>
<p>我确实是 创建了一个branch 然后提交了，但是线上的 CI 环境一直没有通过 不是他妈的 command fail 就是他妈的  no permission 或者是一些更离谱的错误</p>
<p>他妈我之前那家公司怎么要这么离谱，我草你妈的，他妈开发就开发，而且这个不应该找运维吗，他妈这个运维又是谁</p>
<p>然后我把重心转到体验业务上，我打算打开我们业务的网站但是我发现我打不开，提示没有权限，也不跟我说要去和谁申请权限</p>
<p>我他妈又去问了我的leader，我leader回复他妈什么意思</p>
<p>什么叫做 我不需要访问这个业务网页，那他妈发给我的这个文档就是他妈的这个业务的文档啊</p>
<p>这他吗什么意思 我草泥马的 ，就是干看文档 干看代码，不让体验业务 ？？？</p>
<pre><code class="hljs language-txt">@麻伟 这是报价平台。你不用访问吧。权限得 问 @姜晨星 看boe怎么申请
@麻伟 你是要支持的合同域开发，报价只是算是周边上游系统，大概了解一下即可。
重点是从业务链路的角度理解报价是业务流程的上游
</code></pre>
<p><img src="https://marvel-l.github.io/Blog/img.png" alt="img.png"></p>
<h1>情绪</h1>
<h2>生气</h2>
<p>你他妈招我进来，他妈有不管我是他妈什么意思</p>
<h2>不舍</h2>
<p>他妈的，昨天才到了10多个快递</p>
<p>我刚买的鸡胸肉 刚买的玉米 刚买的护肤品 刚卖的垃圾袋 刚买的茶叶 刚买的洗发水 沐浴露 ....</p>
<p>我他妈刚交的 3个月房租 我草泥马</p></article>]]></content:encoded>
      <pubDate>Wed, 23 Sep 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-09-28T00:00:00.000Z</atom:updated>
      <category domain="category">日常</category>
      <category domain="tag">日常</category>
      <category domain="tag">我的第二份工作</category>
      <author>Marvel-L</author>
    </item>
    <item>
      <title><![CDATA[Re 北京工作切换]]></title>
      <link>https://marvel-l.github.io/Blog/post/%E5%8C%97%E4%BA%AC%E5%B7%A5%E4%BD%9C%E5%88%87%E6%8D%A2-0x02</link>
      <guid isPermaLink="true">https://marvel-l.github.io/Blog/post/%E5%8C%97%E4%BA%AC%E5%B7%A5%E4%BD%9C%E5%88%87%E6%8D%A2-0x02</guid>
      <description><![CDATA[失望！！]]></description>
      <content:encoded><![CDATA[<article><h1>写在前沿</h1>
<p>我在 CAM 工作了两年，可以说毫无收获, 又或者说我没来得及去整理导致我认为我这两年毫无收获？
可是说实话 我今年写的代码都忘记了，更别提我去年写的代码
CAM :<br>
一家 Web3 ，面向 B 端的 资产管理项目 。 整个项目结构使用package进行拆分业务模块
部署方式通过私有化部署，可以算是一个单体应用
最常见的优化方式就是增加本地缓存因为对实时性并没有这么高
整个技术栈如下 :
开发 : Golang , 本地缓存 ，Redis缓存，pg-sql
监控 : influxdb, grafana
我映像中就没有了
乐观主义相信, "种一棵树最好的时间是十年前，其次是现在"
但是悲观主义的我相信 "温水煮青蛙" ，青蛙被煮死了自然活不过来了
然后我开始找工作，发现市面上的岗位投完，只拿到了 北京的 这个offer ， 而且还是一个外包</p>
<h1>入职</h1>
<p>今天第一天入职，说实话体验不是很好 主要有以下几点</p>
<ol>
<li>
<p>年假一开始说的 5天，我忍了。 结果到了线下的时候 说是根据工作时间进行动态发放的，例如现在是9月份了，工作到 12月份，那么只有 1.5天还是多少天了</p>
</li>
<li>
<p>工作可能会出差</p>
</li>
<li>
<p>我的Leader不是我们公司的，因为是外包公司，我的Leader是字节正式员工，我们不在同一个办公楼</p>
<ol>
<li>而且我的 Leader 对我们属于散养形式，并没有特别明确的路线规划</li>
</ol>
</li>
<li>
<p>公司福利很少，零食只有一个月发一次，另外组内氛围很差，因为是外包每个人都有每个人自己的事，可以认为每个人都是独立的</p>
</li>
<li>
<p>公司在18楼 19楼，每次都需要等电梯，每次进出公司都要刷工牌，上班的时候需要等电梯</p>
</li>
<li>
<p>没有迎新环节，没有组内吃饭，去的楼下食堂吃饭的 人很多很难吃 北京的饭都挺难吃的</p>
</li>
</ol>
<h2>入职学习</h2>
<p>今天早上 9 : 30 到办公室，然后入职培训到了 12:00 ，主要是 HR 培训，IT部门培训，行政培训</p>
<p>中午的时候自己一个人吃饭</p>
<p>下午的时候很离谱了</p>
<p>我12:40睡觉，睡到 13:00 起来。 我发现我的同事们有的 13:30 才睡觉，有的 14:00 还在睡觉什么的</p>
<p>我们还需要字节那边配合开通字节端的账号，所以14:00前 我都没有什么任务，然后我就出去走了走，大概到了14:00，还是14:30才有账号</p>
<p>开始看一些入职的事情，整个入职文档写的很烂，看着是我们外包同学写的，他也才入职没多久，很多问题都是问了其他小伙伴解决的</p>
<p>大部分就是内网问题 和 权限问题 。 安装软件都很麻烦，然后下班前还在弄 Go仓库依赖，字节那边限制 一天只能下载50个私有仓库，问了其他小伙伴他们都说没遇到过</p>
<p>然后我就直接下班了，我的leader也没有问我什么</p>
<p>我并不感觉我能学到什么，说实话 。 感觉外包 没有明确的需求，现在也没看到明确的测试，更没有完整的开发手册 。。。。 ，感觉整个流程还不如我上家公司，无非是这家公司技术栈更多一点</p>
<h1>那我现在应该怎么办？</h1>
<p>首先我女朋友在考研，预计明年3月份出分数，而且她明年6月份毕业，我很爱她，她说如果没考上的话 希望我能够回长沙陪她一年。所以到时候可能还要回去</p>
<p>现在我简单想了一下有这几个决策</p>
<ol>
<li>
<p>现在就离职，然后去找一个长沙的工作 或者是找一个深圳的 离长沙近的工作 。</p>
<ol>
<li>
<p>可是如果找不到怎么办 ？</p>
<ol>
<li>找不到就硬找到过年?我女朋友会不会嫌弃我, 而且 gap 时间越拖越久，如果gap一年会不会影响找下一份工作，导致滚雪球 ？然后完全找不到工作</li>
</ol>
</li>
</ol>
</li>
<li>
<p>现在离职，然后去考研</p>
<ol>
<li>这样子我可以很好的和 我女朋友同一届，如果考上的话</li>
<li>但是问题是没考上怎么办，而且考上了读研还要脱产3年，到时候毕业出来年龄很大了怎么办</li>
<li>考上研的话，到时候还可以重新实习 重新以应届生的身份参加秋招，相当于改命</li>
</ol>
</li>
<li>
<p>工作6个月，到明年2月份 然后离职，或者说开始找新工作</p>
<ol>
<li>保证不会gap太久，而且期间还有工资可以拿</li>
<li>但是6个月可能不会有太出色的内容能写到简历上，我工作了2年 写到简历上都感觉没什么好写的，更别提6个月了，那么我这6个月的意义不是浪费时间吗</li>
</ol>
</li>
<li>
<p>现在就开始投，然后用入职的这不忙的一个月开始准备跳槽</p>
<ol>
<li>这个看上去很好，但是会有公司收吗，他们可能会问是否在职，我说在职，又会问会什么立马就跳？</li>
<li>而且我第一轮面试下来确实结果不好，我是不是要花钱报班或者是找人辅导封装一下才行</li>
</ol>
</li>
</ol>
<p>我貌似没有路可以走了，我不知道该怎么办</p>
<p>我貌似想进大厂，又想要稳定的陪女朋友，想要稳定的工作</p>
<p>但是我面试的时候 要么没有垂直经验，要么工作经验不匹配，要么就是KPI面，要么就是没有C端经验 。。。。</p></article>]]></content:encoded>
      <pubDate>Tue, 22 Sep 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-09-28T00:00:00.000Z</atom:updated>
      <category domain="category">重要决策</category>
      <category domain="tag">life</category>
      <category domain="tag">工作</category>
      <category domain="tag">重要选择</category>
      <author>Marvel-L</author>
    </item>
    <item>
      <title><![CDATA[三本社招6年Go后端]]></title>
      <link>https://marvel-l.github.io/Blog/post/%E4%B8%89%E6%9C%AC%E7%A4%BE%E6%8B%9B6%E5%B9%B4Go%E5%90%8E%E7%AB%AF-0x01</link>
      <guid isPermaLink="true">https://marvel-l.github.io/Blog/post/%E4%B8%89%E6%9C%AC%E7%A4%BE%E6%8B%9B6%E5%B9%B4Go%E5%90%8E%E7%AB%AF-0x01</guid>
      <description><![CDATA[我能复刻的路吗]]></description>
      <content:encoded><![CDATA[<article><h1>个人介绍</h1>
<p>大家好，我是18年毕业的三本计算机专业的本科生。在个人介绍里我会大概说一下在校经历、第一段工作经历、第二段工作经历。</p>
<h2>在校经历</h2>
<p>当时我们学校即是本科中最差的三本，也几乎是三本中垫底的一所，再少几分就可以落到专科学校的那种。</p>
<p>所以学习氛围自然不如985，211这些学校，我大一、大二也是玩过来的，没怎么学习。</p>
<p>直到大三才幡然醒悟，开始为自己做 <ins>未来的职业规划以及恶补技术知识</ins>，<mark>所以当时在大三参加了师兄师姐开的Java课程（类似于黑马编程培训班之类的课程）</mark>。</p>
<p>课程结束后对自己的技术信心满满，课程结束也恰逢大三暑假开始，就直接投了社招进了家外包公司。</p>
<p><strong>为什么投的社招？</strong></p>
<p><ins>当时对于我们学校来说投校招的氛围不是很足</ins>（当然学习氛围也很差，大部分人都是混混日子），</p>
<p>大家甚至日常在学校也不会谈论到校招、社招这些话题（可能这就是三本和985、211学校的区别吧😅）。</p>
<p>所以当时我对校招、社招的也没什么理解，也不知道有什么不同。</p>
<p>再有一点我看我们学校以往的校招职位都是很low那种，我都不确定有没有IT公司的，印象中都是那些什么销售、厂工...</p>
<p>校招没什么好机会，再加上当时对自己技术能力的自信，于是大三暑假就开始了投社招。</p>
<p><strong>为什么去了外包公司？</strong></p>
<p>其实当时也有投其他私企和国企，可是在社招渠道还是挺在意工作经验的，再加上学历也不是很好。</p>
<p>即使写了课程中做的项目，对于社招渠道还是捉襟见肘，几乎都没给面试机会。</p>
<p>只有那家外包公司给了面试机会，最后也面过了。当时觉得自己还是蛮厉害的，但是现在回头看或许除了比在校其他三本学生技术强点之外，也许外包技术能力要求比较低吧😅。</p>
<h2>第一段工作经历（外包）</h2>
<p>严格来讲我在这家外包公司工作差不多待了四年，因为大四一整年我除了考试回去，其他时间都在公司里，大学课程都是舍友帮我举手。</p>
<p><strong>为什么外包公司也能待四年？</strong></p>
<p>当时我很少看网上的职场信息，也是因为在那四年里我感觉我每天都有在学到东西，而不是重复性的无脑工作。</p>
<p>我在刚入职2个月后被叫去研究当时热门的新技术（区块链），而且当时公司没人懂，只能靠自己在网上查资料学习，还要学会安排项目时间，由区块链发展历史开始学起，从0到1帮助公司落地区块链项目。</p>
<p><ins>所以四年里，我做了包括产品经理、PM、后端开发、运维这些职位的工作。</ins> 也参与了很多比赛拿了奖，参与了很多开源社区的聚会，尽管忙碌，但是每天都感觉充实。</p>
<p><strong>从外包裸辞</strong></p>
<p>尽管在第四年我提了加工资，也顺利给我加了。<mark>但感觉项目已经趋于成熟，也要开始做一些重复性的工作了，加之自己想去更大的平台发展，就选择了裸辞。</mark></p>
<p>因为在外包公司很忙，比较少时间在工作的同时学习跳槽需要的知识，<mark>再加上当时家里经济情况也允许我裸辞（我想到最坏的情况下我2-3个月没有收入也不会怎么样）</mark>，于是就这么做了。</p>
<p><strong>裸辞后开始面试</strong></p>
<p>当时大、中、小公司都面过，印象中没人问起第一家公司是不是外包。我当时裸辞的2-3个月里有刷算法，和部分八股，但是八股只看了一点点，经不起细问（特别是MySQL八股没怎么细看）。</p>
<p>印象比较深的有两家：</p>
<ol>
<li>
<p>面领星，首先要做笔试题，我感觉我写的都挺好。但是 MySQL 没答好就挂了</p>
</li>
<li>
<p>面菜鸟的时候，面试官有句话让我印象特别深：==“即使你会运维、开发还有其他的技术，即使你技术横向扩展很厉害。==但工程技术纵向不够深还是不行啊。你想想对于开发人员来说，开发能力重要还是运维能力重要。”</p>
<p>当时菜鸟面试官那句话对我的打击挺大，也算是点醒了我吧。因为当时还不知道其实在大点的公司，开发与运维有专门的职位，他们都只要在各自的职位的技术栈上够深就行了（当时自己VM玩的还挺溜，其实也不是坏事啦）。</p>
<p>不过这确实是自己的经历，也是这些经历塑造了今天我，他们不需要那就下一家吧！<mark>面试有时候还是讲缘分的。</mark></p>
</li>
</ol>
<h2>第二段工作经历（中小厂）</h2>
<p>当时在外包是做Java的，当时接触到区块链后对 Go 挺感兴趣，这家中小厂也接受Java转Go，就去了。</p>
<p>这家中小厂的规模最多人的时候应该在500-600人左右，虽然人数不及大厂，但是里面很多工作模式，和工作思想都是参考大厂的，可以说是小而美吧。</p>
<p>在这家公司的3年了，我也拿到了公司颁发的一些奖项，和领导的好评。</p>
<p><mark>其实第三年开始对我的成长已经不高了</mark>，然后我一直都想去大厂看看世面，<mark>再加上第三年绩效有个C的指标要给我背</mark>，就加速了我跳槽的进度。</p>
<h1>面试经历</h1>
<p>刚开始面试会比较结巴，然后语言也不够精简，给面试官的体验就不是很好。</p>
<p>有面试官在我反问不足的时候也直接说我的回答有时间很啰嗦，不够简练。</p>
<p>不过随着面试多起来，以及我每次都会反问我的不足并克服它，后面就越来越顺利了。</p>
<p>比如有两个印象比较深的场景：</p>
<table>
<thead>
<tr>
<th>场景</th>
<th>克服前</th>
<th>克服后</th>
</tr>
</thead>
<tbody>
<tr>
<td>面试官：说一件你最自豪的事情吧。我：....（参考克服前的话）。说到一半，面试官：停停停！说这么多，其实不就是...（面试官就帮我总结了我的话）。</td>
<td>我将编译微服所用的内存减少70%，时间减少30%。具体是我先在stackoverflow找出了，然后通过分析之后得出了一份数据，然后再通过 分析了go在编译中实际执行的步骤，然后....（本来想继续说下去，把我实际做的细节全部说出来，但是就被面试官叫停了）</td>
<td>面试官帮我总结成了：“我通过自己在网上查找资料，找到了分析工具及其使用方式，然后通过工具产生的数据优化了微服的依赖包。”其实实际上分析过程是挺耗时耗力的，所以我想把细节尽量说全，来表达这个过程的简单程度，也想秀一波我的思考过程。可是对于面试官来说听起来就很绕，所以如果他有兴趣继续追问，才去说更多细节。如果他本身就对你这个不感兴趣，那反而直接说细节会起到反作用。</td>
</tr>
<tr>
<td>面试官让我介绍简历第一个项目</td>
<td>我按照项目背景、业务流程、重难点的顺序来介绍。关于业务流程我说的太详细了，以至于业务流程说完之后，面试官也是有点懵。在最后也是建议我其实对于业务规则可以简练一点，因为与面试业务不一样，面试官他也不是很关心我上家公司具体业务</td>
<td>原来项目介绍内容比例大概是这么划分：项目背景（20%），业务流程（30%），重难点（50%）后来我自己调整为：项目背景（10%），业务流程（10%），重难点（80%）</td>
</tr>
</tbody>
</table>
<p>投了很多，很多也没给面试机会的，包括阿里和字节都没有面试机会，是比较可惜。我都是在BOSS上投的，另外BAT我在官网上也投了一份。</p>
<p>关于投递 <code>回复率</code> 和 <code>约面率</code> ：我感觉对于中小厂来说投给HR和开发都差不多；</p>
<p>但是如果大厂投给HR就比较低了（虽感觉是学历+过往经历的原因），如果能直接投到开发甚至是组长就会高一些。</p></article>]]></content:encoded>
      <pubDate>Mon, 21 Sep 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-09-28T00:00:00.000Z</atom:updated>
      <category domain="category">求职心得</category>
      <category domain="tag">工作</category>
      <author>Marvel-L</author>
    </item>
    <item>
      <title><![CDATA[他们都去了哪里呢]]></title>
      <link>https://marvel-l.github.io/Blog/post/%E6%88%91%E6%8E%A5%E8%A7%A6%E8%BF%87%E7%9A%84%E4%BA%BA-0x01</link>
      <guid isPermaLink="true">https://marvel-l.github.io/Blog/post/%E6%88%91%E6%8E%A5%E8%A7%A6%E8%BF%87%E7%9A%84%E4%BA%BA-0x01</guid>
      <description><![CDATA[我接触过的一些人，他们现在过得怎么样]]></description>
      <content:encoded><![CDATA[<article><h1>写在前头</h1>
<p>明天就要入职了，睡个中午觉起来，发现比我小一届的学弟竟然跳槽到网易了有点惘然</p>
<p>我的朋友可以说没有，所以只能把他们称作伙伴</p>
<p>当我毕业了，换了工作，离开某个城市。我所谓的朋友就自然的断连了，所以可以认为我没有什么朋友</p>
<p>我的朋友们看着都过的很好，我有点嫉妒有点茫然</p>
<p><img src="https://marvel-l.github.io/Blog/yanghongyi_wangyi.jpg" alt="yanghongyi_wangyi.jpg"></p>
<h2>Numpy</h2>
<p>Numpy 我想想 毕业于 重庆理工大学，双非 机械专业</p>
<p>自学了 C++，PAT甲级满分，蓝桥杯B组国二</p>
<p>一开始入职的是恒生，薪资 15k 还是 11k base 杭州。后面恒生 开始加班 然后他开始跑路</p>
<p>边工作边面试。他不喜欢海投，后面跳槽到了百度的搜推 薪资 22k</p>
<p>他跟我说工作内容，沟通下来比较像是运维，某周需要加班 on call . 不过活大部分都是配置相关的内容</p>
<p>恒生工作2年，跳槽到百度，百度工作了快2年</p>
<p>然后百度裁员，和我差不多一个月被裁了。现在社招一个半月</p>
<p>裁员的时候 就被其他 hr 加上了 推了 拼多多，字节，oppo子公司 这几家看着都挂了，oppo子公司走完hr面后没后续</p>
<p>现在在走腾讯的 Wxg 预计 offer，总共面了5轮了，2面技术面，2面面委面，1面hr面。 等待 offer 中</p>
<h2>YangHongYi</h2>
<p>YangHongYi 我的学弟跟我一个学校 ，实习的时候 我辅导过他一阵子，他的实习简历我记得和我的差不多</p>
<p>或者说他比我多了一个 mit6.824 。我们学校支持外出实习一年，这应该是一个很不错的红利</p>
<p>他在上海游卡实习，然后转正，毕业薪资 17k</p>
<p>我工作了两年，那么他应该是工作了1年2个月 。 现在跳槽去了网易</p>
<p>我不知道这一年他发生了什么，他之前在游戏公司工作，所以经验match到了网易？</p>
<p>他获取到 算法比赛奖项和差不多的，但是我是软件工程 他是电子信息工程 专业不同。其他都差不多</p>
<p>我们都没有选择研究生 而是直接工作，貌似他现在混的比我好</p>
<h2>Guenhao</h2>
<p>Guenhao 我学弟的学弟 。 现在在美团实习</p>
<p>他研毕了一年，因为挂科了导致没保研上，现在应该是正好在研毕。干的 Agent 实习，他的论坛我完全看不懂了，看着涉及到一些 AI 的论文</p>
<p>我们同一个专业 学的同一个专业课，但是现在工作的内容完全看不懂</p>
<h2>其他人</h2>
<p>其他人，大部分都保研去了，我认为他们读了研出来肯定有更好的生活的 不像我</p>
<h2>我</h2>
<p>我始终不知道我走错了哪一步</p>
<p>有一句话是这么说的  "选择比努力更重要"，</p>
<p>如果说我高考失利并没有错误，那么跟我同校或者是学校弱于我，甚至专业弱于我的人，他们貌似都过的比我好</p>
<p>那么你说我实习的时候错了吗？ 没有找到好的公司，去了一家 加密货币的小公司 ？</p>
<p>可是我这个公司也有很多 985 ，211 啊都是硕士 。不过从竞争力上来说，我选择了这家公司确实没有什么竞争力，B圈 web3 在国内就很少有工作</p>
<p>那么我实习选择错了，为什么我选择错了，因为我不努力，所以我在找实习的时候没有好选择，所以我没办法选，我只能这么选吗，我看是的</p>
<p>但是为什么简历，同样的学校，不同专业，过了一年 我学弟就可以去中小公司 我就不行 。是我不够努力？我太笨了，我表达不清楚？我背东西不够熟练？还是说时运不济 ？</p>
<p>我工作了2月2个月，找工作了2个月，面试12家，最终失败，选择了外包，虽然涨薪了40%，但是我高兴不起来</p>
<p>这时候，我貌似更想看中title，而不是工资</p>
<p>他们貌似有更美好的未来，但是我貌似已经没有了</p>
<p>我应该怎么办呢 报个班吗，报班就能好起来吗</p>
<p>简历包装一下吗</p>
<h3>补充</h3>
<p>嫉妒，无比的嫉妒 。 Numpy 现在通知 Wxg OC了。 明明大家都是在用 Ai 编程</p>
<p>无非是履历不同，明明大家都差不多，为什么他们可以这么成功 ？为什么我不行</p>
<p>我感觉我从小到大都是失败的，我脑子里面又有一种声音了 “为什么事情又变成这样了”，为什么又变成这样了！！为什么，为什么，为什么，为什么，为什么</p>
<p>就因为我父母不是小学都没毕业？就因为我是农村人？就因为我没有接受过良好的教育？小时候没有被好好爱过？</p>
<p>为什么他妈会这样子！我操你妈，为什么</p>
<p>YangHongYi 是福建人，家里有国外的亲戚，Guenhao 是山东人家里开理发店的， Numpy 在重庆省会有个房子 ，其他保研的家里也不错</p>
<p>为什么 我不行，为什么，为什么事情又变成这样子了，我到底做错了哪一步？从一出生就错了？我日你妈，草你妈的生活</p>
<p>为什么我他妈甚至记不得我上个月准备的面试，为什么我他妈面试不通过，为什么大厂没有HC，为什么我简历不通过</p>
<p>为什么我都这么努力的工作了，裁员还要把我裁掉，为什么明明我才和女朋友确认关系，我就要分别，为什么，为什么</p></article>]]></content:encoded>
      <pubDate>Mon, 21 Sep 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-09-28T00:00:00.000Z</atom:updated>
      <category domain="category">其他</category>
      <category domain="tag">发展</category>
      <category domain="tag">同路人</category>
      <author>Marvel-L</author>
    </item>
    <item>
      <title><![CDATA[CAM Summary Prompts]]></title>
      <link>https://marvel-l.github.io/Blog/post/cam-summary-prompts</link>
      <guid isPermaLink="true">https://marvel-l.github.io/Blog/post/cam-summary-prompts</guid>
      <description><![CDATA[寻找出最优解]]></description>
      <content:encoded><![CDATA[<article><h1>Prompts</h1>
<p>你现在是 @CAM 项目的 CTO 技术总负责人</p>
<p><strong>问题 :</strong></p>
<p>我想要知道 @cam 中有没有什么模块或者是内容可以用来丰富我的简历</p>
<p><strong>背景 :</strong>
我在 CEFI组工作，主要负责 cefiacc/, tradeaccbiz/, tradeacc/, exg/, custody/, histoytradev2/ 这几个模块</p>
<p>我工作了2年之后被裁员了，我复盘我整个2年过程，我发现我的工作大多都是重复的，在 exg/和custody/对接交易所和托管行，然后在historytradev2/处理记录</p>
<p>然后我总结了一下我下面的这个简历</p>
<p><strong>简历如下 :</strong></p>
<pre><code class="hljs language-md">负责 CAM 交易所资产管理平台后端：覆盖多交易所账户快照、流水记录、对账与数据修复，支撑资产展示、投组配置与风控告警。

<span class="hljs-bullet">-</span> <span class="hljs-strong">**异步补齐链路（asyncFlow）**</span>：从 0 到 1 搭建两套高可用流程（申请 → 轮询 → 下载 → 入库），兼容 REST 抓取与交易所 Async 下载，并与账户回溯打通，支撑历史缺口补齐与对账前数据治理
<span class="hljs-bullet">-</span> <span class="hljs-strong">**Auth 核心表平滑迁移**</span>：针对历史库表设计缺陷，采用双写兼容 + 平滑迁移 + 降级回退，配合灰度发布，一季度内完成核心模块重构并上线
<span class="hljs-bullet">-</span> <span class="hljs-strong">**用户状态机重构**</span>：改造库表与组内核心逻辑，分迭代推进后台任务，并通过 MQ 同步其他业务组，在兼容旧状态的前提下完成快速上线
<span class="hljs-bullet">-</span> <span class="hljs-strong">**存储与性能优化**</span>：基于 I/O、Memory 监控定位窄表膨胀，引入 blob + slim 压缩与 blob<span class="hljs-emphasis">_format 零停机迁移，一季度内关键路径性能提升约 40%，显著降低存储增长斜率
- <span class="hljs-strong">**对账与修复工程化**</span>：维护通用快照 / 记录修复 Job 框架，支持按交易所扩展订正逻辑；优化账户状态维护、限流与鉴权；支持 Excel / 大文件导入补齐，并兼容对账模块
</span></code></pre>
<p><strong>面试情况 :</strong></p>
<p>但是我在一轮面试周期下来，我发现每个任务单独拆并不是一个模块，可以说是一次任务。并不像大厂一样 一个人负责多个模块，导致对于问题“你负责过什么模块，流程是什么样的，难点xx"这种问题很难答上来</p>
<p>同时对于一些C端岗位又会问你这几个项目中是否有并发的需求，怎么处理的，但是实际上工作中也没有</p>
<p>其次面对现有Ai的发展，我们公司也没有主动推进AI的相关需求，所以也没有相关的需求</p>
<p><strong>目标 :</strong></p>
<p>我想要提高我的竞争力，增加我面试通过概率，希望能够优化我简历的内容，补充一些高可用的模块或者是内容</p>
<h1>CC</h1>
<p>结论先说：<strong>你的问题不是没有内容，而是你把一个平台讲成了一堆任务，而且把最值钱的那块完全漏掉了。</strong></p>
<p>我用 git 数据核了一遍你的真实产出：1923 次提交，后端净增约 38.3 万行，时间跨度 2023-05 到 2026-07。你现在这份简历，严重低估了自己。</p>
<hr>
<h2>一、诊断：为什么面试官觉得你"没负责过模块"</h2>
<p>你那 5 条 bullet，全部是<strong>动词开头的任务描述</strong>：搭建、迁移、重构、优化、维护。没有一条告诉面试官"我负责的系统长什么样、边界在哪、谁依赖我"。</p>
<p>面试官问"你负责什么模块"，本质是在问三件事：<strong>这个系统的边界是什么 / 它的架构是你定的吗 / 别人怎么接入你</strong>。你答不上来，不是因为没做过，是因为你自己也没把它当成模块看。</p>
<p>有一个数据能直接推翻你的自我认知：你改动 <code>back/ec/</code>（整个交易所接入层的<strong>核心接口定义层</strong>）达 265 次。<code>ec.IAccService</code> 这个 40+ 方法的接口、<code>ExgErrorProcessor</code> 限流器、统一签名抽象都在这里。<strong>改接口定义的人是平台 owner，只实现接口的人才是干体力活的。</strong> 你是前者，但你的简历把自己写成了后者。</p>
<hr>
<h2>二、你实际拥有的三个模块（按 git footprint 划分）</h2>
<table>
<thead>
<tr>
<th>模块</th>
<th>你的文件改动数</th>
<th>平台量级</th>
</tr>
</thead>
<tbody>
<tr>
<td>交易所/托管统一接入平台（<code>exg/</code> + <code>ec/</code> + <code>exgv2/</code>）</td>
<td>5195 + 265 + 60</td>
<td>你碰过 <strong>166 个</strong>交易所目录，平台注册 <strong>255 种</strong>账户类型</td>
</tr>
<tr>
<td>实时数据同步链路（<code>exgws_v1/</code> + <code>exgws_processor/</code>）</td>
<td>300 + 26</td>
<td>Binance / Coinbase Prime / Panthertrade 等长连接</td>
</tr>
<tr>
<td>历史流水与数据治理（<code>historytradev2/</code> + <code>historytrade_business/</code> + <code>tradeacc_reconciliation/</code> + <code>globalsnapshot_fix/</code>）</td>
<td>1291 + 482 + 245 + 220</td>
<td>13 状态任务状态机，S3 冷归档，对账引擎</td>
</tr>
</tbody>
</table>
<p>这三块任何一块单拎出来，在大厂都是一个正经模块。你欠缺的只是<strong>用架构语言把它们描述出来</strong>。</p>
<hr>
<h2>三、你漏掉的最强素材：实时链路与并发</h2>
<p>你说"工作中没有并发需求"——这是本次分析里最大的误判。</p>
<h3>素材 A：<code>balance_update_processor.go</code>（441 行，你写的）</h3>
<p>这是一份教科书级别的并发面试素材，几乎覆盖了所有八股考点，而且全是真实生产代码：</p>
<pre><code class="hljs language-67:93:back/exgws_v1/binance/balance_update_processor.go">func (p *balanceUpdateProcessorImpl) Process(account string, clearTime int64, balanceDelta string) {
	p.once.Do(p.start)
	p.accountMu.RLock()
	events, exists := p.accountMap[account]
	p.accountMu.RUnlock()
	if !exists {
		p.accountMu.Lock()                     // 如果不存在，需要创建新的 accountEvents
		events, exists = p.accountMap[account] // 再次检查，避免重复创建
		if !exists {
			events = &#x26;accountEvents{...}
			p.accountMap[account] = events
		}
		p.accountMu.Unlock()
	}
	events.mu.Lock() // 现在可以安全地操作 events
	defer events.mu.Unlock()
</code></pre>
<p>能讲的点，每一个都是面试高频题：</p>
<ul>
<li><strong>两级锁降低粒度</strong>：全局 <code>accountMu</code> 只保护 map 结构本身，每个账户有独立的 <code>events.mu</code> 保护自己的事件队列。账户之间完全无锁竞争。</li>
<li><strong>Double-check locking</strong>：先读锁查、未命中再升级写锁、拿到写锁后二次确认。</li>
<li><strong>削峰聚合</strong>：2 分钟聚合窗口 + 50 秒 tick，把同一账户的 N 次 WebSocket 余额变动事件合并成 1 次 REST 查询。这是限流场景下最有效的手段。</li>
<li><strong>信号量控制并发</strong>：<code>concurrencySem chan struct{}</code> 容量 10，防止瞬时打爆交易所 API 配额。</li>
<li><strong>临界区最小化</strong>：第 164-167 行复制切片后立即释放锁，再做耗时的网络请求。</li>
<li><strong>指数退避</strong>：1s / 2s / 4s 三次重试。</li>
<li><strong>内存泄漏防护</strong>：24 小时不活跃的账户从 map 中清理——这点尤其加分，说明你考虑过长期运行的内存增长。</li>
</ul>
<h3>素材 B：你此刻正在写的 <code>asyn_download_worker.go</code>——背压设计</h3>
<pre><code class="hljs language-61:76:back/historytradev2/asyn/publisher/asyn_download_worker.go">// enqueueAsynDownload 将已 completed 的任务交给下载 worker；队列满则回灌 Redis，避免丢任务。
func enqueueAsynDownload(detail common.DownLoadIdDetail) {
	startAsynDownloadWorkers()
	job := asynDownloadJob{detail: detail}
	select {
	case asynDownloadJobCh &#x3C;- job:
		...
	default:
		asyn.Logger.Warn(...)
		store(detail, cam.JsonMarshal(detail), "DownloadQueueFull")
	}
}
</code></pre>
<p>有界队列（32）+ 固定 worker（3）+ <strong>队列满时回灌 Redis 而不是阻塞或丢弃</strong>。这是标准的背压（backpressure）设计，面试时展开讲"为什么不用无界 channel"、"为什么不阻塞"，非常能体现工程判断力。</p>
<h3>素材 C：Binance WebSocket API 强制迁移</h3>
<p>这是<strong>高可用变更管理</strong>的完整案例。Binance 公告 2025-11-10 停用 listenKey 鉴权方式，这是一个不可协商的外部硬 deadline，迁移失败意味着所有 Binance 账户实时数据全部中断。</p>
<p>你的做法（从你写的 <code>WSAPI_MIGRATION.md</code> 和 <code>BUGFIX_20251104.md</code> 里复原）：</p>
<ul>
<li><code>UseWSAPI</code> 开关让新旧两套鉴权路径并存，默认关闭，改一个布尔值即可全量回滚</li>
<li>旧路径：REST 取 listenKey → 连 <code>stream.binance.com/ws/{listenKey}</code> → 定期 renew</li>
<li>新路径：直连 <code>ws-api.binance.com</code> → 发送带签名的 <code>userDataStream.subscribe.signature</code> 订阅请求 → 无需 keepalive</li>
<li>消息处理要新增分流逻辑：响应消息（<code>status</code> 字段）不能透传给业务层，错误消息（<code>-2015</code> API key 失效）要触发自动重连</li>
<li>附带收益：逐仓杠杆（binancem）从"每个 symbol 一条连接"变成"一条连接收全部 symbol"，<strong>连接数大幅下降</strong></li>
</ul>
<p>这条线你踩过的两个坑（方法名要用 <code>.signature</code> 后缀才支持 HMAC/RSA；签名串必须按字母序包含 <code>apiKey</code> 和 <code>timestamp</code>）本身就是很好的面试细节——面试官最喜欢听真实踩坑。</p>
<hr>
<h2>四、"没有并发需求"这个问题，你的话术要换框架</h2>
<p>你被问并发时答不上来，是因为你默认"并发 = 高 QPS 扛流量"。但你做的是<strong>另一类并发问题，而且更难</strong>：</p>
<blockquote>
<p>C 端的并发是"入口流量不可控，我要扛住"；
我们的并发是"出口配额被外部硬限制，我要在不被封禁的前提下最大化吞吐"。
前者可以加机器水平扩展，后者加机器反而会更快触发限流和 IP 封禁。</p>
</blockquote>
<p>围绕这个框架，你有一整套真实答案：</p>
<ul>
<li><strong>配额感知的预判式限流</strong>：<code>bnutil/blockip.go</code> 解析 Binance 响应头 <code>X-Mbx-Used-Weight-1m</code>，到达 95% 阈值就主动禁用 IP 10 秒，而不是等 429 再被动退避</li>
<li><strong>多维度限流</strong>：按 API key / 账户 / 代理 IP 三个维度独立计数（<code>ec/exgerrorprocessor.go</code>）</li>
<li><strong>请求合并</strong>：上面说的 2 分钟聚合窗口</li>
<li><strong>有界并发</strong>：120 goroutine 的抓取请求池（<code>exg_loop/single_call_job.go</code>）、信号量限 10、下载 worker 限 3</li>
<li><strong>背压</strong>：队列满回灌而非丢弃</li>
</ul>
<p>把这套讲清楚，比背一遍"如何设计秒杀系统"更能证明你的工程能力。</p>
<hr>
<h2>五、AI 这块，我要给你一个诚实的提醒</h2>
<p>我查了仓库里唯一的生产级 LLM 应用（<code>cefiacc</code> 里用 DeepSeek 做账户信息校验，<code>check_account_info.go</code>）——<strong>作者是 zhongtaoliu，不是你，不能写进简历</strong>。面试官如果追问实现细节你会当场露馅。</p>
<p>但你有两件真实的事可以讲：</p>
<ol>
<li><strong>你本人就是重度 AI 编码实践者</strong>。你写的 <code>WSAPI_MIGRATION.md</code> 结尾明确写着"实现人员：Claude AI"。仓库里 <code>AGENTS.md</code> / <code>CLAUDE.md</code> / <code>back/*/AGENTS.md</code> 的分层规范体系、<code>.github/workflows/scheduled_claude_bug_finder.yml</code> 这个定时 AI Code Review workflow 都是现成的工程实践。</li>
<li><strong>与其编造 AI 业务需求，不如把"AI 辅助研发的方法论"讲成你的差异化</strong>。比如：如何用分层 AGENTS.md 约束 AI 在百万行 monorepo 里的输出质量、如何让 AI 处理 166 个交易所这种高度重复但细节各异的适配工作、AI 生成代码的 review 门禁怎么设。这个话题在 2026 年的面试里，比硬凑一个"AI 需求"可信得多。</li>
</ol>
<hr>
<h2>六、改写后的简历</h2>
<pre><code class="hljs language-md">CAM 加密资产管理平台 · 后端研发（CeFi 组）                        2023.05 - 2026.07

平台服务机构客户的多交易所资产管理，后端为 Go 模块化单体 + 94 个可独立部署进程，
Gin / PostgreSQL / Redis Stream MQ。个人累计提交 1900+，主导三个核心模块。

【模块一】交易所与托管机构统一接入平台（exg / ec，平台注册 255 种账户类型）
<span class="hljs-bullet">-</span> 负责接入层核心抽象设计与演进：Acc（业务编排）/ SC（单次请求）双层模型，
  统一 IAccService 接口（40+ 方法）+ 默认实现基类，新交易所仅需覆写差异方法，
  将单家接入从"全量实现"降为"增量覆写"，累计支撑 160+ 家交易所与托管机构
<span class="hljs-bullet">-</span> 设计多维度限流与熔断体系：按 API key / 账户 / 代理 IP 三维独立计数，
  解析交易所响应头权重实现"预判式限流"（阈值 95% 主动降级），
  替代被动 429 重试，显著降低 IP 封禁与账户风控触发率
<span class="hljs-bullet">-</span> 统一密钥与签名：业务进程不持有 API Key，全部经独立 Auth 服务远程签名，
  支持 HMAC / RSA / Ed25519 多算法与母子（prop）账户签名降级回退

【模块二】交易所实时数据同步链路（exgws，WebSocket 长连接）
<span class="hljs-bullet">-</span> 主导 Binance WebSocket API 鉴权迁移（官方 2025-11-10 停用 listenKey 硬 deadline）：
  设计新旧双路径并存 + 单开关灰度，支持秒级回滚；重构消息分流以区分
  订阅响应、鉴权错误（-2015 自动重连）与业务事件；
  逐仓杠杆由「每 symbol 一条连接」改为「单连接全量订阅」，连接数大幅下降
<span class="hljs-bullet">-</span> 从 0 设计余额变动实时处理器（WS 事件驱动 + REST 补全）：
  两级锁（全局读写锁保护账户表 + 账户级独立锁保护事件队列）消除跨账户锁竞争；
  2 分钟聚合窗口将同账户 N 次事件合并为 1 次 API 查询；信号量限制并发账户数；
  指数退避重试 + 不活跃账户定期回收防止内存无界增长
<span class="hljs-bullet">-</span> 扩展 Coinbase Prime、Panthertrade 等交易所 WS 成交与订单推送接入

【模块三】历史流水与数据治理（historytradev2 / 对账 / 快照修复）
<span class="hljs-bullet">-</span> 负责双通路数据采集架构：实时轮询引擎（120 并发有界请求池 + Redis 进度游标 +
  重叠时间窗防漏）与交易所异步导出管线（申请 → 轮询 → 下载 → 解析 → 入库）
<span class="hljs-bullet">-</span> 设计 13 态任务状态机，状态在 PG / Redis / MQ 三层冗余：
  发版重启自动恢复中断任务、下载 worker 有界队列满时回灌队列防丢任务、
  CSV 按文件序号断点续传、下载链接过期自动刷新重试，实现全链路可恢复
<span class="hljs-bullet">-</span> 存储优化：基于 I/O 与内存监控定位宽表膨胀，引入 blob 压缩（zstd/xz，
  编解码器池化复用）+ 精简热表分离 + 180 天冷数据 S3 归档，
  关键路径性能提升约 40%，存储增长斜率显著下降
<span class="hljs-bullet">-</span> 维护通用数据修复框架与对账引擎（期初快照 + 流水 = 期末快照），
  支持按交易所扩展订正逻辑、幂等重跑与历史快照反算

【其他】Auth 核心表双写平滑迁移与灰度上线；账户状态模型重构并经 MQ 同步下游业务方
</code></pre>
<p>改动要点：每个模块先给<strong>边界和量级</strong>，再给<strong>架构决策</strong>，最后给<strong>结果</strong>。并发和高可用从"没有"变成了贯穿全文的主线。</p>
<hr>
<h2>七、三个高频问题的应答骨架</h2>
<p><strong>"你负责什么模块，架构是什么样的？"</strong>
选模块一。先画三层（Acc / SC / Util）+ 注册表路由，说清楚"我定义接口、160 家交易所实现接口"的关系，然后主动抛出一个设计权衡：<em>为什么新增能力要开独立 interface + 类型断言，而不是往 <code>IAccService</code> 上加方法</em>——因为那个接口有 255 个实现，加一个方法全部编译失败。这个回答能立刻证明你是 owner 而不是使用者。</p>
<p><strong>"有并发场景吗？"</strong>
先用第四节的框架重新定义问题，再用 <code>balance_update_processor</code> 展开：两级锁、double-check、聚合窗口、信号量、内存回收。这一个例子足够撑起 15 分钟深挖。</p>
<p><strong>"最有挑战的项目？"</strong>
讲 Binance WS 迁移。它同时具备：不可协商的外部 deadline、全量账户受影响的爆炸半径、鉴权协议级改造、灰度与回滚设计、真实踩坑（签名串字段序）、以及意外收益（连接数下降）。这是你手上叙事完整度最高的一个故事。</p>
<hr>
<p>最后一个提醒：你说"工作了 2 年"，但 git 记录显示你的提交从 2023 年 5 月延续到 2026 年 7 月，跨度 3 年 2 个月（2024 年 2-5 月有一段空档）。如果那段早期提交属于正式工作期，<strong>你应该按 3 年写</strong>——在简历筛选阶段这是实打实的差别，值得你自己核对一下。</p></article>]]></content:encoded>
      <pubDate>Sun, 20 Sep 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-09-28T00:00:00.000Z</atom:updated>
      <category domain="category">prompts</category>
      <category domain="tag">cam</category>
      <author>Marvel-L</author>
    </item>
    <item>
      <title><![CDATA[北京工作切换]]></title>
      <link>https://marvel-l.github.io/Blog/post/%E5%8C%97%E4%BA%AC%E5%B7%A5%E4%BD%9C%E5%88%87%E6%8D%A2-0x01</link>
      <guid isPermaLink="true">https://marvel-l.github.io/Blog/post/%E5%8C%97%E4%BA%AC%E5%B7%A5%E4%BD%9C%E5%88%87%E6%8D%A2-0x01</guid>
      <description><![CDATA[跳板？失败？]]></description>
      <content:encoded><![CDATA[<article><h1>写在开头</h1>
<p>我 7月17 号被裁员 ，我的策略是</p>
<ul>
<li>先看一下 邓明的Golang初级开发课程
<ul>
<li>登陆注册、Feed流、文章模块、支付模块、微服务拆分模块</li>
</ul>
</li>
<li>然后补了一下一个 单Agent 的 AI 项目
处理了这两个内容花了我一个月时间，然后我开始投递和准备八股文 。</li>
</ul>
<p>然后开始投递大概半个月还是1个月时间，或者说面试了2周，9月17号左右到达北京</p>
<p>我只有Golang这个语言栈，导致我能投递的岗位很少，<strong>感觉全中国只有 300家</strong>。</p>
<p>我投了符合工作经验的 <strong>180 家</strong> ，最后约面的 <strong>只有 14 家</strong></p>
<p>最终我只拿到了 2 家 或者说 只拿到了一家</p>
<p>一家北京的字节外包，我不确定这个是什么形式的外包。 北京阅安，今年4月份成立的公司。 涨薪40%</p>
<p>一家深圳的Ai公司，但是这家公司比较小。我完成了 CTO面之后，hr面给我鸽了，说是没有HC了. 有些生气，但是也无可奈何 。</p>
<pre><code class="hljs language-txt">xxx，是这样的，坦诚跟你交流， 内部有一个人，总体磨合下来，欠缺了一点。
我收到你短信的时候，我去跟技术口沟通了。
上级还在犹豫，技术口是希望能再给他机会，看看有没有改进的空间。
但是也担心会耽误你，你看这样行不行，您这边也可以再留意一下其他机会。
我们内部也再看下是否要果决一些。
</code></pre>
<h1>来北京之前</h1>
<p>来北京之前呢, 我和我谈了好久的女朋友发生了关系, 她今年还在准备考研时间并不是很多。 我跟她线下见面了好几次</p>
<p>最终发生了关系, 我和她尝试了好多第一次我没尝试过的东西</p>
<ol>
<li>一起去饭店吃饭</li>
<li>一起在河边散步</li>
<li>一起坐摩天轮</li>
<li>一起吃烧烤</li>
<li>一起亲嘴</li>
<li>一起舌吻</li>
<li>一起住酒店</li>
<li>第一次去KTV</li>
<li>一次喝奶茶</li>
<li>一起吃肉蟹煲</li>
<li>第一次去线下的Switch游玩店</li>
<li>一起骑车</li>
<li>一起拥抱</li>
<li>一起睡觉
....</li>
</ol>
<p>说实话我单身了 20多年了，第一次和女孩子做这些内容，我们双方都很喜欢对方，她很信任我，我也很喜欢她</p>
<p>我认为我的后半生都给她了，至少目前是这样的。</p>
<p>虽然不知道是不是上天凑巧，让我在被裁员的时候 她主动加我的联系方式，还是什么 。虽然凑巧 但是也不凑巧</p>
<p>因为她在考研所以我不能打扰她，而且我被裁员了我还要准备我的工作面试 。所以呢 我一个人来到了北京</p>
<p><img src="https://marvel-l.github.io/Blog/my_baby_and_me.jpg" alt="my_baby_and_me.jpg"></p>
<h1>来到北京</h1>
<p>我一个人来到了北京，住在北京海淀区。这里是北京的三环，但是给我的感觉很差，我在北京待了3天，待一天骂一天</p>
<p>首先</p>
<ol>
<li>地铁。 北京的地铁很多，但是地铁修的并不好，地铁站比较小而且很多</li>
<li>高铁。 北京的高铁站和其他高铁站差不多，而且人很多，我周四下的高铁 人都爆满</li>
<li>住房。 3000块钱只能租到一个合租的地方，如果想要整租需要4000，5000 。我之前在长沙都只要1500啊</li>
<li>吃的。 3环这边全是小区楼没有大的商场，全都是小店铺 也没有地摊，吃的东西都是甜食，人均20+，30+</li>
<li>环境。 健身房死贵，附近没有可以跑步的地方，这里除了胡同就只有胡同。</li>
</ol>
<p>总之我对北京彻底失望了，我破防了，但是我房租已经交了，其实我来北京那一天我就想过 要不要直接回老家继续面试了，但是没有人理我，我的女朋友没理我，我的群友没理我，我的姐姐没理我。所以我就这么租了</p>
<p>而且北京这里都是押一付3，我怎么都要工作了</p>
<p><img src="https://marvel-l.github.io/Blog/bei_jing.jpg" alt="bei_jing.jpg"></p></article>]]></content:encoded>
      <pubDate>Sat, 19 Sep 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-09-28T00:00:00.000Z</atom:updated>
      <category domain="category">重要决策</category>
      <category domain="tag">life</category>
      <category domain="tag">工作</category>
      <category domain="tag">重要选择</category>
      <author>Marvel-L</author>
    </item>
  </channel>
</rss>