万人千题计划-30

今日题解

推荐社区:万人千题

我们社区新增加了问答频道,大家可以在里面询问有关算法的问题,如果直到如何解决,社区成员会为你们解答的

判断字符是否唯一

思路:哈希集合不用我再多说了吧

class Solution {
public:
    bool isUnique(string astr) {
        unordered_set<char> set;
        for(int i=0; i<astr.size(); i++) {
            if(set.count(astr[i]) != 0) {
                return false;
            }
            set.insert(astr[i]);
        }
        return true;
    }
};

第一次只出现一次的字符

思路:用哈希表来统计字符出现的次数,若遍历该字符只出现一次,则返回它的下标,否则返回一个空字符

class Solution {
public:
    char firstUniqChar(string s) {
        unordered_map<char, int> map;
        for(char &c : s) {
            map[c]++;
        }

        for(char &c : s) {
            if(map[c] == 1) return c;
        }
        return ' ';
    }
};

赎金信

思路:用一维数组代替哈希表,提高效率;
先遍历magazine,将里面的字符去重,并对各个字符进行计数
最后遍历ransomNote,如果ransomNote中的字符在magazine中的不存在,则返回false

class Solution {
public:
    bool canConstruct(string ransomNote, string magazine) {
        int record[26] = {0};
        for(int i=0; i<magazine.size(); i++) {
            record[magazine[i] - 'a']++;
        }

        for(int i=0; i<ransomNote.size(); i++) {
            record[ransomNote[i] - 'a']--;
            if(record[ransomNote[i] - 'a'] < 0) {
                return false;
            }
        }
        return true;
    }
};

飞机座位分配概率

思路:其实是抽签的意思,只有一个人没票,
第n个乘客要么坐在自己的位置上,要么坐在其他人的位置,只有1/2的几率
所以除了只有一个人的情况下,任何人坐在自己座位上的几率都是1/2

class Solution {
public:
    double nthPersonGetsNthSeat(int n) {
        return n == 1 ? 1.0 : 0.5;
    }
};

期望个数统计

思路:这题目意思就是让我们去重,然后求剩下数组的大小;
使用哈希集合,不用排序,速度还快

class Solution {
public:
    int expectNumber(vector<int>& scores) {
        unordered_set<int> hashset;
        for(auto &s : scores) {
            hashset.insert(s);
        }
        return hashset.size();
    }
};

用rand7()实现rand10()

思路:调用两次Rand7(),那么可以生成 1-49 之间的随机整数,我们只用到其中的前 40 个用来实现Rand10()

class Solution {
public:
        int rand10() {
        int num1=rand7(), num2=rand7();
        while(num1+(num2-1)*7>40){//当大于40时退出循环
            num1=rand7() , num2=rand7();
        }
        return (num1+(num2-1)*7)%10+1;//产生0-10的随机数
    }
};

n个骰子的点数

思路:错了好多次才整出来的,淦
1、初始化第一个骰子的值,从第二个骰子开始计算,
2、第i个骰子能够得到5i+1个数,状态压缩,
3、开辟5i+1的数组空间,遍历每一个可能投掷得到的数值,
4、它可以从第i-1个骰子能得到的数值(dp数组中记录的值)
5、加上当前第i个骰子可能投的数(1~6)转移过来,只要除6就行

class Solution {
public:
    vector<double> dicesProbability(int n) {
        vector<double> dp(6, 1.0/6.0);
        for(int i=2; i<=n; ++i) {
            vector<double> temp(5*i + 1, 0);
            for(int j=0; j<dp.size(); ++j) {
                for(int k=0; k<6; ++k) {
                    temp[j+k] += dp[j]/6.0;
                }
            }
            dp = temp;
        }
        return dp;
    }
};
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

0泡果奶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值