521.最长特殊序列
题目描述
给定两个字符串,你需要从这两个字符串中找出最长的特殊序列。最长特殊序列定义如下:该序列为某字符串独有的最长子序列(即不能是其他字符串的子序列)。
子序列可以通过删去字符串中的某些字符实现,但不能改变剩余字符的相对顺序。空序列为所有字符串的子序列,任何字符串为其自身的子序列。
输入为两个字符串,输出最长特殊序列的长度。如果不存在,则返回 -1。
示例 :
输入: “aba”, “cdc”
输出: 3
解析: 最长特殊序列可为 “aba” (或 “cdc”)
思路
这个题坑就坑在题意上,把题意理解了的话,就是下面这个意思:
如果两个字符串相等,那么没有;
如果不相等,返回两字符串中的最大长度
代码
class Solution {
public:
int findLUSlength(string a, string b) {
return a == b ? -1 : max(a.size(), b.size());
}
};
258. 各位相加
题目描述
给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。
示例:
输入: 38
输出: 2
解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。
思路
没什么难的
代码一(递归版本)
class Solution {
public:
int addDigits(int num) {
if(num/10 == 0)
return num;
return addDigits(num%10 + addDigits(num/10));
}
};
代码二(循环版本)
class Solution {
public:
int addDigits(int num) {
while(num/10)
{
num = num%10 + num/10;
}
return num;
}
};
代码三(进阶)
就是找规律啦LOL,不好找,看的Hint,然后又看的维基百科
class Solution {
public:
int addDigits(int num) {
return num-9*((num-1)/9);
}
};
496. 下一个更大元素 I
题目描述
给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。
nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出-1。
示例 1:
输入: nums1 = [4,1,2], nums2 = [1,3,4,2].
输出: [-1,3,-1]
解释:
对于num1中的数字4,你无法在第二个数组中找到下一个更大的数字,因此输出 -1。
对于num1中的数字1,第二个数组中数字1右边的下一个较大数字是 3。
对于num1中的数字2,第二个数组中没有下一个更大的数字,因此输出 -1。
示例 2:
输入: nums1 = [2,4], nums2 = [1,2,3,4].
输出: [3,-1]
解释:
对于num1中的数字2,第二个数组中的下一个较大数字是3。
对于num1中的数字4,第二个数组中没有下一个更大的数字,因此输出 -1。
思路
题目已经把处理步骤说的很清楚了
代码
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums) {
vector<int> ret;
for(int i = 0;i<findNums.size();i++)
{
vector<int>::iterator pos = find(nums.begin(),nums.end(),findNums[i]);
pos++;
while(pos!=nums.end())
{
if(*pos>findNums[i])
{
ret.push_back(*pos);
break;
}
pos++;
}
if(pos==nums.end())
ret.push_back(-1);
}
return ret;
}
};