(一)算法


文章目录

  • 项目地址
  • 一、题目
    • [1.1 基础题](#1.1 基础题)
      • [1. 反转字符串](#1. 反转字符串)
      • [2. 判断回文字符串](#2. 判断回文字符串)
      • [3. 两个数组的交集](#3. 两个数组的交集)
      • [4. 字符串中第一个不重复的字符](#4. 字符串中第一个不重复的字符)
      • [5. LRU 缓存机制 (经典 OOD 题)](#5. LRU 缓存机制 (经典 OOD 题))
      • [6. 写一个线程安全的 有界队列](#6. 写一个线程安全的 有界队列)
      • [7. 实现一个 LINQ 的 Where 扩展方法](#7. 实现一个 LINQ 的 Where 扩展方法)
      • [8. 并发请求控制](#8. 并发请求控制)
    • [9. 设计 TinyUrl 系统](#9. 设计 TinyUrl 系统)

项目地址

  • 教程作者:
  • 教程地址:
复制代码
  • 代码仓库地址:
复制代码
  • 所用到的框架和插件:

    dbt
    airflow

一、题目

1.1 基础题

1. 反转字符串

输入 "hello",输出 "olleh"。

要求:不能直接用 Array.Reverse。

cs 复制代码
string ReverseString(string input)
{
    if (string.IsNullOrEmpty(input)) return input;

    char[] arr = input.ToCharArray();
    int left = 0, right = arr.Length - 1;

    while (left < right)
    {
        (arr[left], arr[right]) = (arr[right], arr[left]);
        left++;
        right--;
    }

    return new string(arr);
}

2. 判断回文字符串

输入 "abba" 返回 true,输入 "abc" 返回 false。

cs 复制代码
bool IsPalindrome(string input)
{
    if (string.IsNullOrEmpty(input)) return true;

    int left = 0, right = input.Length - 1;
    while (left < right)
    {
        while (left < right && !char.IsLetterOrDigit(input[left])) left++;
        while (left < right && !char.IsLetterOrDigit(input[right])) right--;

        if (char.ToLower(input[left]) != char.ToLower(input[right]))
            return false;

        left++;
        right--;
    }
    return true;
}

3. 两个数组的交集

输入 nums1 = [1,2,2,1],nums2 = [2,2] → 输出 [2,2]。

cs 复制代码
int[] Intersect(int[] nums1, int[] nums2)
{
    var dict = new Dictionary<int, int>();
    foreach (var n in nums1)
    {
        if (!dict.ContainsKey(n)) dict[n] = 0;
        dict[n]++;
    }

    var result = new List<int>();
    foreach (var n in nums2)
    {
        if (dict.ContainsKey(n) && dict[n] > 0)
        {
            result.Add(n);
            dict[n]--;
        }
    }

    return result.ToArray();
}

4. 字符串中第一个不重复的字符

输入 "leetcode" → 输出 l

输入 "aabb" → 输出 null 或特殊符号。

cs 复制代码
char? FirstUniqueChar(string s)
{
    var dict = new Dictionary<char, int>();
    foreach (var ch in s)
    {
        if (!dict.ContainsKey(ch)) dict[ch] = 0;
        dict[ch]++;
    }

    foreach (var ch in s)
    {
        if (dict[ch] == 1) return ch;
    }

    return null;
}

5. LRU 缓存机制 (经典 OOD 题)

要求:

Get O(1)

Put O(1)

超出容量时移除最近最少使用的元素。

cs 复制代码
public class LRUCache
{
    private readonly int _capacity;
    private readonly Dictionary<int, LinkedListNode<(int Key, int Value)>> _cache;
    private readonly LinkedList<(int Key, int Value)> _list;

    public LRUCache(int capacity)
    {
        _capacity = capacity;
        _cache = new Dictionary<int, LinkedListNode<(int, int)>>();
        _list = new LinkedList<(int, int)>();
    }

    public int Get(int key)
    {
        if (!_cache.TryGetValue(key, out var node))
            return -1;

        _list.Remove(node);
        _list.AddFirst(node);
        return node.Value.Value;
    }

    public void Put(int key, int value)
    {
        if (_cache.TryGetValue(key, out var node))
        {
            _list.Remove(node);
        }
        else if (_cache.Count >= _capacity)
        {
            var last = _list.Last;
            if (last != null)
            {
                _cache.Remove(last.Value.Key);
                _list.RemoveLast();
            }
        }

        var newNode = new LinkedListNode<(int, int)>((key, value));
        _list.AddFirst(newNode);
        _cache[key] = newNode;
    }
}

6. 写一个线程安全的 有界队列

cs 复制代码
public class BlockingQueue<T>
{
    private readonly Queue<T> _queue = new();
    private readonly int _capacity;
    private readonly object _lock = new();

    public BlockingQueue(int capacity) => _capacity = capacity;

    public void Enqueue(T item)
    {
        lock (_lock)
        {
            while (_queue.Count >= _capacity)
                Monitor.Wait(_lock);

            _queue.Enqueue(item);
            Monitor.PulseAll(_lock);
        }
    }

    public T Dequeue()
    {
        lock (_lock)
        {
            while (_queue.Count == 0)
                Monitor.Wait(_lock);

            var item = _queue.Dequeue();
            Monitor.PulseAll(_lock);
            return item;
        }
    }
}

7. 实现一个 LINQ 的 Where 扩展方法

  • 模拟实现 IEnumerable.Where
cs 复制代码
public static class MyLinqExtensions
{
    public static IEnumerable<T> MyWhere<T>(
        this IEnumerable<T> source,
        Func<T, bool> predicate)
    {
        foreach (var item in source)
        {
            if (predicate(item))
                yield return item;
        }
    }
}

8. 并发请求控制

写一个方法,接收一组 Func,限制同时最多执行 N 个任务,直到全部完成。

cs 复制代码
public async Task RunWithMaxConcurrency(IEnumerable<Func<Task>> tasks, int maxConcurrency)
{
    using SemaphoreSlim semaphore = new(maxConcurrency);
    var runningTasks = tasks.Select(async task =>
    {
        await semaphore.WaitAsync();
        try
        {
            await task();
        }
        finally
        {
            semaphore.Release();
        }
    });
    await Task.WhenAll(runningTasks);
}

9. 设计 TinyUrl 系统

输入长链接 "https://example.com/abc/def"

输出短链接 "http://tinyurl.com/xyz123"

要求短链接能还原为长链接。

cs 复制代码
public class TinyUrlService
{
    private readonly Dictionary<string, string> _map = new();
    private readonly string _baseUrl = "http://tinyurl.com/";
    private readonly Random _random = new();

    public string Encode(string longUrl)
    {
        var key = Guid.NewGuid().ToString("N").Substring(0, 6);
        _map[key] = longUrl;
        return _baseUrl + key;
    }

    public string Decode(string shortUrl)
    {
        var key = shortUrl.Replace(_baseUrl, "");
        return _map[key];
    }
}
相关推荐
没有bug.的程序员4 分钟前
100%采样率引发的全线熔断:Spring Boot 链路追踪的性能绞杀与物理级调优
java·spring boot·后端·生产·熔断·调优·链路追踪
不懒不懒7 分钟前
【基于 CNN 的食物图片分类:数据增强、最优模型保存与学习率调整实战】
开发语言·python
木井巳10 分钟前
【多线程】常见的锁策略及 synchronized 的原理
java·开发语言
代码改善世界12 分钟前
【C++初阶】类和对象(二):默认成员函数详解与日期类完整实现
开发语言·c++
专注VB编程开发20年13 分钟前
VS2026调试TS用的解析/运行引擎:确实是 ChakraCore.dll(微软自研 JS 引擎)
开发语言·javascript·microsoft
郝学胜-神的一滴16 分钟前
深入理解Python生成器:从基础到斐波那契实战
开发语言·前端·python·程序人生
weixin_6495556717 分钟前
C语言程序结构第四版(何钦铭、颜晖)第十章函数与程序结构之递归实现顺序输出整数
c语言·数据结构·算法
想七想八不如1140819 分钟前
复试简历复盘--CV论文
算法
南梦浅20 分钟前
网站redis从开发到部署方案
java·jvm·redis
问水っ21 分钟前
Qt Creator快速入门 第三版 第6章 事件系统
开发语言·qt