【模拟面试】#5 最接近的三数之和 山羊拉丁文 最长快乐前缀

题目1

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

示例:

输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。

提示:

  • 3 <= nums.length <= 10^3
  • -10^3 <= nums[i] <= 10^3
  • -10^4 <= target <= 10^4

思路及代码

首先对数组进行排序

将前三个数相加赋给close,表示初始化 

在第一层for循环中,定义双指针就j和k,j指向当前i的下一个元素,k指向末尾元素,计算三数之和并且赋给tmp,判断abs(tmp - t) 和 abs(close - t)的大小,前者小,将前者赋给初始变量closeNum;之后判断tmp和目标值t的大小,大于 说明需要拿小的补充,因此k--;小于说明要拿大的补充,因此j++,等于 直接返回tmp

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        sort(nums.begin(),nums.end());

        int close = nums[0]+nums[1]+nums[2];;

        for(int i = 0;i < nums.size() - 2;i++){
            int j = i+1;
            int k = nums.size() - 1;

            while(j < k){
                int tmp = nums[i]+nums[j]+nums[k];
                if(abs(tmp - target) < abs(close - target)){
                    close = tmp;
                }

                if(tmp < target){
                    j++;
                }else if(tmp > target){
                    k--;
                }else{
                    return tmp;
                }
            }

        }

        return close;
    }
};

题目2

给定一个由空格分割单词的句子 S。每个单词只包含大写或小写字母。

我们要将句子转换为 “Goat Latin”(一种类似于 猪拉丁文 - Pig Latin 的虚构语言)。

山羊拉丁文的规则如下:

  • 如果单词以元音开头(a, e, i, o, u),在单词后添加"ma"
    例如,单词"apple"变为"applema"
  • 如果单词以辅音字母开头(即非元音字母),移除第一个字符并将它放到末尾,之后再添加"ma"
    例如,单词"goat"变为"oatgma"
  • 根据单词在句子中的索引,在单词最后添加与索引相同数量的字母'a',索引从1开始。
    例如,在第一个单词后添加"a",在第二个单词后添加"aa",以此类推。

返回将 S 转换为山羊拉丁文后的句子。

示例 1:

输入: "I speak Goat Latin"
输出: "Imaa peaksmaaa oatGmaaaa atinLmaaaaa"

示例 2:

输入: "The quick brown fox jumped over the lazy dog"
输出: "heTmaa uickqmaaa rownbmaaaa oxfmaaaaa umpedjmaaaaaa overmaaaaaaa hetmaaaaaaaa azylmaaaaaaaaa ogdmaaaaaaaaaa"

说明:

  • S 中仅包含大小写字母和空格。单词间有且仅有一个空格。
  • 1 <= S.length <= 150

思路及代码

纯模拟题,没什么好说的

class Solution {
public:
    string toGoatLatin(string S) {
        S = S + " ";

        int len = S.size();
        vector<string> vec;


        int pos = 0;
        for(int i = 0;i < len;i++){
            if(S[i] == ' '){
                string a = S.substr(pos,i-pos);
                vec.push_back(a);
                pos = i+1;
            }
        }

        string ret = "";
        for(int i = 0;i < vec.size();i++){

            if(vec[i][0] == 'a' || vec[i][0] == 'A' || vec[i][0] == 'e' || vec[i][0] == 'E' || vec[i][0] == 'i' || vec[i][0] == 'I' || vec[i][0] == 'o' || vec[i][0] == 'O' || vec[i][0] == 'u' || vec[i][0] == 'U'){
                vec[i] = vec[i] + "ma";
            }else{
                char c = vec[i][0];
                vec[i] = vec[i].erase(0,1) + c;
                vec[i] = vec[i] + "ma";
            }

            for(int j = 0;j < i+1;j++){
                vec[i] = vec[i] + "a";
            }

            if(i == vec.size() - 1){
                ret = ret + vec[i];
            }else{
                ret = ret + vec[i] + " ";
            }
        }

        return ret;
    }
};

题目3

「快乐前缀」是在原字符串中既是 非空 前缀也是后缀(不包括原字符串自身)的字符串。

给你一个字符串 s,请你返回它的 最长快乐前缀

如果不存在满足题意的前缀,则返回一个空字符串。

示例 1:

输入:s = "level"
输出:"l"
解释:不包括 s 自己,一共有 4 个前缀("l", "le", "lev", "leve")和 4 个后缀("l", "el", "vel", "evel")。最长的既是前缀也是后缀的字符串是 "l" 。

示例 2:

输入:s = "ababab"
输出:"abab"
解释:"abab" 是最长的既是前缀也是后缀的字符串。题目允许前后缀在原字符串中重叠。

示例 3:

输入:s = "leetcodeleet"
输出:"leet"

示例 4:

输入:s = "a"
输出:""

提示:

  • 1 <= s.length <= 10^5
  • s 只含有小写英文字母

思路及代码

使用string_view直接莽过去了,这里是看别人的思路才知道应该是KMP,string_view也是第一次了解。

一篇关于C++17新特性string_view的文章https://www.jianshu.com/p/9b8eeddbf1e4

其它算法:https://www.dreamwings.cn/leetcode1392/5591.html

KMP算法还需要继续巩固一下!

class Solution {
public:
    string longestPrefix(string s) {
        int len = s.size();

        if(len == 1){
            return "";
        }

        std::string_view view = s;

        for(int i = len - 1;i >= 0;i--){
            if(view.substr(0,i) == view.substr(len - i ,i)){
                return s.substr(0,i);
            }

        }

        return "";
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值