题目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 "";
}
};