华为OD机试常见类型题目的C++ 代码实现(二)

  1. 最长公共子序列(LCS)
#include 
#include 
using namespace std;

// 函数功能:计算两个序列的最长公共子序列的长度
// 参数 seq1:第一个序列
// 参数 seq2:第二个序列
int longestCommonSubsequence(vector<int>& seq1, vector<int>& seq2) {
    int m = seq1.size();
    int n = seq2.size();
    // 创建二维动态数组dp,用于保存中间结果
    vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
    for (int i = 1; i <= m; ++i) {
        for (int j = 1; j <= n; ++j) {
            // 如果当前位置的元素相等
            if (seq1[i - 1] == seq2[j - 1]) {
                dp[i][j] = dp[i - 1][j - 1] + 1;
            } else {
                // 取左边或者上边的最大值
                dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
            }
        }
    }
    return dp[m][n];
}
  1. 数字组合
#include 
#include 
using namespace std;

// 函数功能:计算从给定数字列表中组合出目标数字的方法数
// 参数 candidates:数字列表
// 参数 target:目标数字
int combinationSum4(vector<int>& candidates, int target) {
    vector<unsigned long long> dp(target + 1, 0);
    dp[0] = 1;
    for (int i = 1; i <= target; ++i) {
        for (int num : candidates) {
            if (i - num >= 0) {
                dp[i] += dp[i - num];
            }
        }
    }
    return dp[target];
}
  1. 字符串中的单词反转
#include 
#include 
#include 
#include 
using namespace std;

// 函数功能:反转字符串中的单词顺序
// 参数 str:输入的字符串
string reverseWords(string str) {
    stringstream ss(str);
    vector<string> words;
    string word;
    // 将字符串按空格分割并存入向量
    while (ss >> word) {
        words.push_back(word);
    }
    string result;
    for (int i = words.size() - 1; i >= 0; --i) {
        result += words[i];
        if (i > 0) {
            result += " ";
        }
    }
    return result;
}
  1. 有效括号序列判断
#include 
#include 
#include 
using namespace std;

// 函数功能:判断字符串中的括号是否是有效序列
// 参数 s:包含括号的字符串
bool isValid(string s) {
    stack<char> st;
    for (char c : s) {
        if (c == '(' || c == '[' || c == '{') {
            st.push(c);
        } else {
            if (st.empty()) {
                return false;
            }
            char top = st.top();
            if ((c == ')' && top == '(') || (c == ']' && top == '[') || (c == '}' && top == '{')) {
                st.pop();
            } else {
                return false;
            }
        }
    }
    return st.empty();
}
  1. 寻找峰值元素
#include 
#include 
using namespace std;

// 函数功能:在给定的数组中寻找峰值元素(比相邻元素大的元素)
// 参数 nums:整数数组
int findPeakElement(vector<int>& nums) {
    int left = 0;
    int right = nums.size() - 1;
    while (left < right) {
        int mid = left + (right - left) / 2;
        // 如果mid元素小于mid + 1元素,说明峰值在mid右侧
        if (nums[mid] < nums[mid + 1]) {
            left = mid + 1;
        } else {
            right = mid;
        }
    }
    return left;
}

你可能感兴趣的:(c和指针,华为od,c++,开发语言)