常用算法

// 判断素数
bool isPrime(int x) {
    if (x < 2) return false;
    for (int i = 2; i * i <= x; i++) {
        if (x % i == 0) return false;
    }
    return true;
}

// 判断闰年
bool isLeapYear(int x) {
    if (x % 400 == 0 || (x % 4 == 0 && x % 100 != 0)) return true;
    return false;
}

// 求最大公约数
int gcd(int a, int b) {
    return b == 0 ? a : gcd(b, a % b);
}

// 求最小公倍数
int lcm(int a, int b) {
    return a / gcd(a, b) * b;
}

// 求阶乘
int factorial(int x) {
    int res = 1;
    for (int i = 2; i <= x; i++) {
        res *= i;
    }
    return res;
}

// 求组合数
int combination(int n, int m) {
    return factorial(n) / factorial(m) / factorial(n - m);
}

// 分解质因数
vector<int> primeFactor(int x) {
    vector<int> res;
    for (int i = 2; i * i <= x; i++) {
        while (x % i == 0) {
            res.push_back(i);
            x /= i;
        }
    }
    if (x > 1) res.push_back(x);
    return res;
}

// 求欧拉函数
int euler(int x) {
    int res = x;
    for (int i = 2; i * i <= x; i++) {
        if (x % i == 0) {
            res = res / i * (i - 1);
            while (x % i == 0) x /= i;
        }
    }
    if (x > 1) res = res / x * (x - 1);
    return res;
}

// 求逆元
int inverse(int a, int p) {
    return a == 1 ? 1 : (long long)(p - p / a) * inverse(p % a, p) % p;
}

约瑟夫环

// 约瑟夫环问题
void josephus_problem() {

    int n, m;
    cin >> n >> m;
    vector<int> vec1(n);    // vector
    for (int i = 0; i < n; i++) {
        vec1[i] = i + 1;
    }
    int index = 0;  // 记录当前位置
    while (vec1.size() > 1) {
        index = (index + m - 1) % vec1.size();  // 计算下一个位置
        vec1.erase(vec1.begin() + index);   // 删除当前位置的元素
    }
    cout << vec1[0] << endl;

}

bool 转换 true 或 false

cout << boolalpha << containsDuplicate(nums) << endl;
cout << (containsDuplicate(nums) ? "true" : "false") << endl;

向量读入

while (cin >> num) {
    nums.push_back(num);
    if (cin.get() == '\n') break;
}

读取并创建二叉树

// 读取 3 9 20 null null 15 7
    int val;
    string s;
    cin >> val;
    TreeNode *root = new TreeNode(val);
    queue<TreeNode*> q;
    q.push(root);
    while (cin >> s) {
        if (s == "null") {
            q.front()->left = nullptr;
        } else {
            val = stoi(s);
            TreeNode *node = new TreeNode(val);
            q.front()->left = node;
            q.push(node);
        }
        cin >> s;
        if (s == "null") {
            q.front()->right = nullptr;
        } else {
            val = stoi(s);
            TreeNode *node = new TreeNode(val);
            q.front()->right = node;
            q.push(node);
        }
        q.pop();
        if (cin.get() == '\n') break;
    }

判断素数

bool isPrime(int x) {
    if (x < 2) return false;
    for (int i = 2; i * i <= x; i++) {
        if (x % i == 0) return false;
    }
    return true;
}

创建和输出 二叉树

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

// 二叉树结点的定义
struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode() : val(0), left(nullptr), right(nullptr) {}
    TreeNode(int _val) : val(_val), left(nullptr), right(nullptr) {}
    TreeNode(int _val, TreeNode *_left, TreeNode *_right) : val(_val), left(_left), right(_right) {}
};

// 创建二叉树,返回根结点指针
TreeNode *createTree(vector<int>& nums) {
    TreeNode *root = new TreeNode(nums[0]);  // 创建二叉树的根节点
    
    queue<TreeNode*> q;  // 创建队列,用于按照层序顺序建立二叉树
    q.push(root);
    
    int i = 1;  // 迭代器,用于遍历 vector 中的每一个元素
    while (!q.empty() && i < nums.size()) {  // 只要队列不为空且 vector 中还有元素就继续遍历
        TreeNode* node = q.front();
        q.pop();
        if (i < nums.size()) {  // 预防越界
            if (nums[i] != -1) {  // 如果 vector 中的元素不是 -1,说明需要构建左子树
                node->left = new TreeNode(nums[i]);
                q.push(node->left);
            }
            i++;
            
            if (i < nums.size()) {  // 预防越界
                if (nums[i] != -1) {  // 如果 vector 中的元素不是 -1,说明需要构建右子树
                    node->right = new TreeNode(nums[i]);
                    q.push(node->right);
                }
                i++;
            }
        }
    }
    
    return root;
}

int main() {
    vector<int> nums = {1, 2, 3, -1, -1, 4, 5};  // 待转化为二叉树的 vector,其中 -1 表示该节点为空节点
    TreeNode* root = createTree(nums);  // 创建二叉树并获取根结点指针
    // 层序遍历并输出
    queue<TreeNode*> q;
    q.push(root);
    while (!q.empty()) {
        int size = q.size();
        for (int i = 0; i < size; i++) {
            TreeNode* node = q.front();
            q.pop();
            cout << node->val << " ";
            if (node->left != nullptr) {
                q.push(node->left);
            }
            if (node->right != nullptr) {
                q.push(node->right);
            }
        }
    }
    cout << endl;
    return 0;
}

创建和输出 链表

#include <iostream>
#include <vector>
using namespace std;

// 链表结点的定义
struct ListNode {
    int val;
    ListNode* next;
    ListNode(int x) : val(x), next(nullptr) {}
};

// 创建链表,返回链表的头结点指针
ListNode* createList(vector<int>& nums) {
    ListNode* head = nullptr;  // 头结点指针初始化为空
    ListNode* tail = nullptr;  // 尾结点指针初始化为空
    for (int i = 0; i < int(nums.size()); i++) {  // 遍历 vector,逐个创建结点插入链表中
        ListNode* node = new ListNode(nums[i]);
        if (head == nullptr) {
            head = node;
        } else {
            tail->next = node;
        }
        tail = node;
    }
    return head;
}

int main() {
    vector<int> nums = {1, 2, 3, 4, 5};  // 定义向量
    ListNode* head = createList(nums);  // 创建链表并获取头结点指针
    // 遍历链表并输出每个结点的值
    ListNode* p = head;
    while (p != nullptr) {
        cout << p->val << " ";
        p = p->next;
    }
    cout << endl;
    return 0;
}

stringstream 用法

#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
using namespace std;

const int N = 10010;
int n;
int a[N];

int main() {
	int cnt;
	cin >> cnt;
    
	string line;
	getline(cin, line);
    
	while (cnt -- ) {
		getline(cin, line);
		stringstream ssin(line);
		while (ssin >> a[n]) n ++ ;
	}

	sort(a, a + n);

	int res1, res2;
	for (int i = 1; i < n; i ++ )
		if (a[i] == a[i - 1]) res2 = a[i];
		else if (a[i] >= a[i - 1] + 2) res1 = a[i] - 1;

	cout << res1 << ' ' << res2 << endl;

	return 0;
}

二分查找

int binarySearch(vector<int>& nums, int target) {
	if (nums.size() == 0)
		return -1;

	int left = 0, right = nums.size() - 1;
	while (left <= right) {
		int mid = left + ((right - left) >> 1);
		if (nums[mid] == target) {
			return mid;
		}
		// 搜索区间变为 [mid+1, right]
		else if (nums[mid] < target)
			left = mid + 1;
		// 搜索区间变为 [left, mid - 1]
		else
			right = mid - 1;
	}
	return -1;
}

二维矩阵输出

int main() {
    int num;
    cin >> num;
    vector<vector<int>> res = generateMatrix(num);
    for (int i = 0, n = res.size(); i < n; i++) {
        for (int j = 0, m = res[i].size(); j < m; j++) {
            cout << res[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
}

vector 标准输入输出

// 解法一 : 暴力枚举

# include <bits/stdc++.h>
using namespace std;

vector<int> twoSum(vector<int>& nums, int target) {
    for (int i = 0, n = nums.size(); i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            if (nums[i] + nums[j] == target) return {i, j};
        }
    }
    return {};
}

int main() {
    vector<int> nums;
    int num, target;
    while (cin >> num) {        // 读入数据
        nums.push_back(num);
        char ch = getchar();
        if (ch == '\n') break;        
    }
    cin >> target;              // 读入目标值
    vector<int> res = twoSum(nums, target);
    for (int i = 0, n = res.size(); i < n; i++) {
        cout << res[i] << " ";
    }
    cout << endl;
    return 0;
}