首页 > 编程语言 >算法面经

算法面经

时间:2024-02-25 12:23:21浏览次数:19  
标签:return cur nums int res 面经 算法 vector

数组

88. 合并两个有序数组

经典 逆向双指针

void merge(vector<int> &nums1, int m, vector<int> &nums2, int n) {  
    for (int i = m - 1, j = n - 1, k = m + n - 1; ~j; k--) {  
        nums1[k] = i >= 0 && nums1[i] > nums2[j] ? nums1[i--] : nums2[j--];  
    }  
}

4. 寻找两个正序数组的中位数

困难,hot100,必会题,重点是求两个数组中第k大的数

double findMedianSortedArrays(vector<int> &nums1, vector<int> &nums2) {  
    int m = nums1.size(), n = nums2.size();  
    int a = getKth(0, 0, (m + n + 1) / 2, nums1, nums2);  
    int b = getKth(0, 0, (m + n + 2) / 2, nums1, nums2);  
    return (a + b) / 2.0;  
}  
  
int getKth(int i, int j, int k, vector<int> &nums1, vector<int> &nums2) {  
    int m = nums1.size(), n = nums2.size();  
    if (i >= m) {  
        return nums2[j + k - 1];  
    }  
    if (j >= n) {  
        return nums1[i + k - 1];  
    }  
    if (k == 1) {  
        return min(nums1[i], nums2[j]);  
    }  
    int p = k / 2;  
    int x = i + p - 1 < m ? nums1[i + p - 1] : INT_MAX;  
    int y = j + p - 1 < n ? nums2[j + p - 1] : INT_MAX;  
    return x < y ? getKth(i + p, j, k - p, nums1, nums2) : getKth(i, j + p, k - p, nums1, nums2);  
}

15. 三数之和

两数之和升级版,方法完全不一样,还用hash的话,会有很多特殊情况需要考虑,推荐使用 排序+双指针 法。字节常考题,必会。

vector<vector<int>> threeSum(vector<int> &nums) {  
    sort(nums.begin(), nums.end());  
    vector<vector<int>> ans;  
    int n = nums.size();  
    for (int i = 0; i < n - 2 && nums[i] <= 0; i++) {  
        if (i && nums[i] == nums[i - 1]) continue;  
  
        int j = i + 1, k = n - 1;  
        while (j < k) {  
            int x = nums[i] + nums[j] + nums[k];  
            if (x < 0) {  
                j++;  
            } else if (x > 0) {  
                k--;  
            } else {  
                ans.push_back({nums[i], nums[j++], nums[k--]});  
                while (j < k && nums[j] == nums[j - 1]) {  
                    j++;  
                }  
                while (j < k && nums[k] == nums[k + 1]) {  
                    k--;  
                }  
            }  
        }  
    }  
    return ans;  
}

字符串

5. 最长回文子串

必须掌握,方法1:动态规划,方法2:中心扩展法

/* f[i][j] 即 s[i...j]是否为回文串  
 * if s[i]=s[j],f[i][j]=f[i-1][j+1] */
string longestPalindrome(string s) {  
    int n = s.size();  
    vector<vector<bool>> f(n, vector<bool>(n, true));  
    int k = 0, mx = 1;  
    for (int i = n - 2; i >= 0; i++) {  
        for (int j = i + 1; j < n; j++) {  
            f[i][j] = false;  
            if (s[i] == s[j]) {  
                f[i][j] = f[i + 1][j - 1];  
                if (f[i][j] && mx < j - i + 1) {  
                    mx = j - i + 1;  
                    k = i;  
                }  
            }  
        }  
    }  
    return s.substr(k, mx);  
}

// 中心扩展发
class Solution1 {  
public:  
    string palindrome(string s, int l, int r) {  
        int n = s.size();  
        while (l >= 0 && r < n && s[l] == s[r]) {  
            l--;  
            r++;  
        }  
        return s.substr(l + 1, r - l - 1);  
    }  
  
    string longestPalindrome(string s) {  
        string res = "";  
        for (int i = 0; i < s.length(); i++) {  
            string s1 = palindrome(s, i, i);  
            string s2 = palindrome(s, i, i + 1);  
            res = res.size() > s1.size() ? res : s1;  
            res = res.size() > s2.size() ? res : s2;  
        }  
        return res;  
    }  
};

2的1000次方

字符串乘法,腾讯面试题

#include <iostream>  
#include <string>  
  
using namespace std;  
  
string multiplyByTow(const string &num) {  
    string res;  
    int carry = 0;  
    for (int i = num.size() - 1; i >= 0; i--) {  
        int digit = num[i] - '0';  
        int product = digit * 2 + carry;  
        carry = product / 10;  
        res.insert(res.begin(), '0' + (product % 10));  
    }  
    while (carry > 0) {  
        res.insert(res.begin(), '0' + (carry % 10));  
        carry /= 10;  
    }  
    return res;  
}  
  
int main() {  
    string res = "1";  
    for (int i = 0; i < 1000; i++) {  
        res = multiplyByTow(res);  
    }  
    cout << "2^1000 = " << res << endl;  
}

14. 最长公共前缀

字符串最常考的题,面试不会直接回家种田

string longestCommonPrefix(vector<string> &strs) {  
    for (int i = 0; i < strs[0].size(); i++) {  
        for (int j = 1; j < strs.size(); j++) {  
            if (i >= strs[j].size() || strs[j][i] != strs[0][i]) {  
                return strs[0].substr(0,i);  
            }  
        }  
    }  
    return strs[0];  
}

哈希表

1. 两数之和 不必多言
3. 无重复字符的最长子串 双指针+哈希表

链表

翻转链表

标签:return,cur,nums,int,res,面经,算法,vector
From: https://www.cnblogs.com/cheng-sir/p/18032246

相关文章

  • 走进Kaggle的未知领域:性别和年龄推断算法解析
    ​1、环境设置:此环节将加载实现笔记本无缝功能的基本模块,包括NumPy、Pandas和TensorFlow等库。此外,它还建立了关键的环境常数,如图像尺寸和学习率,这对后续分析和模型训练至关重要。#Generalimportosimportkerasimportnumpyasnpimportpandasaspdimporttensorflow......
  • Big-Yellow的算法工程师进阶之路
    Big-Yellow的算法工程师进阶之路一、基础算法二、基础数据结构2.1链表三、......
  • 代码随想录算法训练营第二天| 977.有序数组的平方
    第一题题解首先写了一个初步解,后续再想优化思路classSolution:defsortedSquares(self,nums:List[int])->List[int]:#sortbytheabsofvalueabs_min=10000abs_min_index=0foriinrange(len(nums)):if......
  • 【深度学习】Logistic回归算法和向量化编程。全md文档笔记(代码文档已分享)
    本系列文章md笔记(已分享)主要讨论深度学习相关知识。可以让大家熟练掌握机器学习基础,如分类、回归(含代码),熟练掌握numpy,pandas,sklearn等框架使用。在算法上,掌握神经网络的数学原理,手动实现简单的神经网络结构,在应用上熟练掌握TensorFlow框架使用,掌握神经网络图像相关案例。具体......
  • 代码随想录算法训练营第二十七天| 93.复原IP地址 78.子集 90.子集II
    复原IP地址 题目链接:93.复原IP地址-力扣(LeetCode)思路:投降。在判断字符串是否合法这部分遇到了困难。classSolution{private:vector<string>result;//记录结果//startIndex:搜索的起始位置,pointNum:添加逗点的数量voidbacktracking(string&s,int......
  • 图像识别算法--VGG16
    前言:人类科技就是不断烧开水(发电)、丢石头(航天等)。深度学习就是一个不断解方程的过程(参数量格外大的方程)本文内容:1、介绍VGG16基本原理2、VGG16pytorch复现图像识别算法--VGG16目录图像识别算法--VGG161、参考文献2、VGG16理论2.1VGG16优点2.2VGG16网络结构图2.2.1复现代......
  • 集成学习算法汇总
    集成学习算法(EnsembleLearning)传统机器学习算法(例如:决策树,人工神经网络,支持向量机,朴素贝叶斯等)都是通过弱学习机(weaklearners)来对目标进行预测(分类)。但是,以决策树算法为例,决策树算法在递归过程中,可能会过度分割样本空间,最终导致过拟合。集成学习(EnsembleLearning)算法......
  • 2024牛客寒假算法基础集训营4个人补题题解(B、E)
    B、左右互博不能操作的情况有且仅有所有石子堆的石子个数只有1的时候,因此不管途中怎么操作,让所有石子堆都变成1的总操作次数是确定的。即假设一共有\(n\)堆石子,石子总数为\(sum\),总操作次数为\((sum-n)\)次。因此当\((sum-n)\)%\(2=0\)时一定在sweet操作完(或没有操作)后gui无法......
  • Python数据结构与算法05——归并排序
    归并排序:defmerge_sort(aimlist):#归并排序拆分-排序-合并也就是merge_返回的是是一个已经排好序的列表n=len(aimlist)ifn<=1:returnaimlistmid=n//2aimlist_left=merge_sort(aimlist[:mid])aimlist_right=merge_sort(aimlist[mid:......
  • SLR算法
    目录SLR算法算法步骤与LR0算法的区别SLR算法编译原理中的SLR(SimpleLR)算法是一种用于解决文法分析冲突的策略,它基于LR(0)算法,但进行了一些简化和改进。SLR算法通过引入FOLLOW集来解决冲突,使得在特定状态下,可以根据下一个输入符号是属于移进集合还是某个FOLLOW集来决定动作。在......