leetcode第138场双周赛题解(c++)

Q1.求出数字答案

给你三个  整数 num1 ,num2 和 num3 。

数字 num1 ,num2 和 num3 的数字答案 key 是一个四位数,定义如下:

  • 一开始,如果有数字 少于 四位数,给它补 前导 0 
  • 答案 key 的第 i 个数位(1 <= i <= 4)为 num1 ,num2 和 num3 第 i 个数位中的 最小 值。

请你返回三个数字 没有 前导 0 的数字答案。

示例 1:

输入:num1 = 1, num2 = 10, num3 = 1000

输出:0

解释:

补前导 0 后,num1 变为 "0001" ,num2 变为 "0010" ,num3 保持不变,为 "1000" 。

  • 数字答案 key 的第 1 个数位为 min(0, 0, 1) 。
  • 数字答案 key 的第 2 个数位为 min(0, 0, 0) 。
  • 数字答案 key 的第 3 个数位为 min(0, 1, 0) 。
  • 数字答案 key 的第 4 个数位为 min(1, 0, 0) 。

所以数字答案为 "0000" ,也就是 0 。

示例 2:

输入: num1 = 987, num2 = 879, num3 = 798

输出:777

示例 3:

输入:num1 = 1, num2 = 2, num3 = 3

输出:1

提示:

  • 1 <= num1, num2, num3 <= 9999

       

#include<iostream>
#include<string>
using namespace std;
int generateKey(int num1, int num2, int num3){
    //将数字转换成字符串,前导零补充
    string s1=to_string(num1);
    string s2=to_string(num2);
    string s3=to_string(num3);

    // 或者是 s1.insert(0,4-s1.length(),'0');
    while (s1.size()<4) s1="0"+s1;
    while(s2.size()<4) s2="0"+s2;
    while(s3.size()<4) s3="0"+s3;

    string res;
    //min
    for(int i=0;i<4;i++){
        char min_char=min(min(s1[i],s2[i]),s3[i] );
        res+=min_char;
    }
    // 转换结果字符串为整数,去掉前导零
        return stoi(res);
}
int main(){
    int num1 = 987, num2 = 879, num3 = 798;
    int res=generateKey(num1,num2,num3);
    cout<<res<<endl;
    return 0;
}

Q2.哈希分割字符串

给你一个长度为 n 的字符串 s 和一个整数 k ,n 是 k 的 倍数 。你的任务是将字符串 s 哈希为一个长度为 n / k 的新字符串 result 。

首先,将 s 分割成 n / k 个 

子字符串

 ,每个子字符串的长度都为 k 。然后,将 result 初始化为一个  字符串。

我们依次从前往后处理每一个 子字符串 :

  • 一个字符的 哈希值 是它在 字母表 中的下标(也就是 'a' → 0 ,'b' → 1 ,... ,'z' → 25)。
  • 将子字符串中字幕的 哈希值 求和。
  • 将和对 26 取余,将结果记为 hashedChar 。
  • 找到小写字母表中 hashedChar 对应的字符。
  • 将该字符添加到 result 的末尾。

返回 result 。

示例 1:

输入:s = "abcd", k = 2

输出:"bf"

解释:

第一个字符串为 "ab" ,0 + 1 = 1 ,1 % 26 = 1 ,result[0] = 'b' 。

第二个字符串为: "cd" ,2 + 3 = 5 ,5 % 26 = 5 ,result[1] = 'f' 。

示例 2:

输入:s = "mxz", k = 3

输出:"i"

解释:

唯一的子字符串为 "mxz" ,12 + 23 + 25 = 60 ,60 % 26 = 8 ,result[0] = 'i' 。

提示:

  • 1 <= k <= 100
  • k <= s.length <= 1000
  • s.length 能被 k 整除。
  • s 只含有小写英文字母。
#include<iostream>
#include<string>
using namespace std;
string stringHash(string s,int k){
    string ans;
    int n=s.length();
    for(int i=0;i<n;i+=k){
        int sum=0;
        for(int j=0;j<k;j++){
            sum+=s[i+j]-'a';
        }
        char temp='a'+(sum%26);
        ans+=temp;
    }
    return ans;
}
int main(){
    string s = "mxz";
    int  k = 3;
    string ans = stringHash(s,k);
    cout<<ans<<endl;
}

老实说,前两道就是简单思路题,还是可以很快写完

后面题就不想写了,唉

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值