一.概念
模拟算法其实就是根据题目做,题目要求什么,就做什么。一些复杂的模拟题其实还是把一些简单的操作组合了一下,所以模拟题是最锻炼耐心的,也是训练编码能力的最好的暴力算法。
对于模拟题而言,最关键的其实是数据结构,看到一个问题,选择合适的数据结构,然后根据问题来实现对应的功能。模拟题的常见数据结构主要就是:数组、字符串、矩阵、链表、二叉树等等。
模拟时一般会用到一些算法技巧,或者说混合算法,比如排序、递归、迭代等等。
总结来说:就是题目让怎么做就怎么做,然后运用合适的数据结构和算法来解决。
二.习题
1. 交换数字
class Solution {
public:
vector<int> swapNumbers(vector<int>& a) {
//异或^ ,相同为0,不同为1
//a[0] = x a[1] = y
a[0] = a[0] ^ a[1];//此时 a[0] = x ^ y,a[1] = y
a[1] = a[0] ^ a[1];//a[1] = (x ^ y) ^ y = x ^ (y ^ y) = x ^ 0 = x; 此时 a[0] = x ^ y,a[1] = x
a[0] = a[0] ^ a[1];//a[0] = (x ^ y) ^ x = y ^ (x ^ x) = y ^ 0 = y; 此时 a[0] = y,a[1] = x
return a;
}
};
2.位 1 的个数
class Solution {
public:
int hammingWeight(uint32_t n) {
int sum =0;
while(n){ // 当 n 不为 0 时继续循环
sum += n & 1;// 检查最低位是否为 1
n = (n>>1); // 右移一位,相当于去掉最低位
}
return sum;
}
};
3.找到数组的中间位置
class Solution {
public:
int findMiddleIndex(vector<int>& nums) {
//int pre =0,hold = 0;放这里的话,每次都会叠加之前数,所以不对
for(int i = 0;i<nums.size();i++){
int pre =0,hold = 0;//放这里的话,每次叠加都是从0开始
for(int j =0;j<i;j++){
pre += nums[j];
}
for(int j = i+1;j<nums.size();j++){
hold += nums[j];
}
if(pre == hold){
return i;
}
}
return -1;
}
};