算法-模拟

一.概念

        模拟算法其实就是根据题目做,题目要求什么,就做什么。一些复杂的模拟题其实还是把一些简单的操作组合了一下,所以模拟题是最锻炼耐心的,也是训练编码能力的最好的暴力算法。

        对于模拟题而言,最关键的其实是数据结构看到一个问题,选择合适的数据结构,然后根据问题来实现对应的功能。模拟题的常见数据结构主要就是:数组、字符串、矩阵、链表、二叉树等等。

        模拟时一般会用到一些算法技巧,或者说混合算法,比如排序、递归、迭代等等。

        总结来说:就是题目让怎么做就怎么做,然后运用合适的数据结构和算法来解决。

二.习题

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;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值