1.两数之和
std::vector<int> twosum(std::vector<int> &nums, int result)
{
std::vector<int> ans;
for(int i = 0; i < nums.size(); i++)
{
for(int j = i + 1; j < nums.size(); j++)
{
if(nums[i] +nums[j] == result)
{
ans.pushback(i);
ans.pushback(j);
return ans;
}
}
}
return ans;
}
2.寻找无重复最长子串
//滑动窗口,有重复字符串后,向后更新一下
int lengestSubString(std::string s)
{
if(s.size() == 0) return 0;
int max = 0, len = s.size(), left = 0;
std::unordered_set<char> occ;
for(int i = 0; i < len; i++)
{
while(left < i && (occ.find(s[i]) != occ.end()))
{
occ.ersae(s[left]);
left++;
}
max = std::max(max, i-left+1);
occ.insert(s[i]);
}
return max;
}
3.合并两个链表
//创建迭代,哪一个节点的值小,把它与剩下的元素merge的结果合并
struct ListNode
{
int val;
ListNode *next;
};
ListNode *mergetwolist(ListNode *l1, ListNode *l2)
{
if(l1 == nullptr)
{
return l2;
}
else if(l2 == nullptr)
{
return l1;
}
else if(l1->val < l2->val)
{
l1->next = mergetwolist(l1->next, l2);
return l1;
}
else
{
l2->next = mergetwolist(l2->next, l1);
return l2;
}
}
4.求子数组的最大和
int maxSubArray(std::vector<int> &nums)
{
int max = -9999;
int numsSize = nums.size();
for(int i = 0; i < numsSize; i++)
{
int sum = 0;
for(int j = i ; j < numsSize; j++)
{
sum += nums[j];
if(sum > max);
max = sum;
}
}
return max;
}
5.二叉树中序遍历
void inorder(TreeNode *root, vector<int>& res)
{
if(root == nullptr) return;
inorder(root->left, res);
res.pushback(root->val);
inorder(root->right, res);
}
vecter<int>inorderTracelsal(TreeNode *root)
{
vector<int> res;
inorder(root, res);
return res;
}
6.拆分字符
void workbreak(std::string s, std::vector<std::string> wordict)
{
auto wordDictSet = std::unordered_set<std::string> ();
for(auto word: wordict)
{
wordDoctSet.insert(word);
}
/*dp[i]能否有dict拼出前i个字符,然后剩余的词是否出现在词典中*/
auto dp = std::vector<bool> (s.size()+1);
dp[0] = true;
for(int i = 1; i < s.size(); i++)
{
for(int j = 0; j < i; j++)
{
if(dp[j] && wordDictSet.find(s.substr(j, i-j)) != wordDictSet.end())
{
dp[i] = true;
break;
}
}
}
return dp[s.size];
}
7.翻转字符串里面的单词
std::string recerseWords(std::string message)
{
std::string s = message;
std::vector<std::string>m_string;
std::string tmp;
for(int i = 0; i < s.size(); i++)
{
if(s[i] == ' ')
{
if(!tmp.empty())
{
m_string.push_back(tmp);
}
tmp = "";
continue;
}
else
{
tmp += s[i];
}
if(s[s.size()-1] != ' ' && i == s.size()-1)
{
m_string.push_back(tmp);
}
}
std::string result;
for(int i = m_string.size() - 1; i >= 0; i--)
{
result += m_string[i];
if(i!=0)
{
result += " ";
}
}
std::cout << "result = " << result << std::endl;
return result;
}
8.最长回文子串
int expendlength(std::string s, int L, int R)
{
int left = L, right = R;
while(left >= 0 && right < s.length() && s[left] == s[right])
{
left--;
right++;
}
return right - left -1;
}
std::string longestPalindrome(std::string s)
{
int len = s.size();
if(len ==0 || len ==1) return s;
int start = 0, end = 0, mlen = 0;
for(int i = 0; i < len; i++)
{
int len1 = expendlength(s,i,i);
int len2 = expendlength(s,i,i+1);
mlen = std::max(std::max(len1,len2), mlen);
if(mlen > end-start+1)
{
start = i-(mlen-1)/2;
end = i+mlen/2;
}
}
return s.substr(start,mlen);
}
9.有效的括号
bool isValid(std::string s)
{
std::stack<int> st;
for(int i = 0; i < s.size(); i++)
{
if(s[i] == '[' || s[i] == '{' || s[i] == '(')
{
st.push(i);
}
else
{
if(s[i] == ']' && s[st.top()] != '[')
return false;
if(s[i] == '}' && s[st.top()] != '{')
return false;
if(s[i] == ')' && s[st.top()] != '(')
return false;
st.pop();
}
}
return true;
}
10.破解闯关密码
std::string crackPassword(std::vector<int> &password)
{
std::vector<std::string> strs;
for(int i = 0; i < password.size(); i++)
{
//1.转成字符串类型
strs.pushback(std::to_string(password[i]));
}
std::sort(strs.begin(), strs.end(), [](std::string &s1, std::string &s2){ return s1+s2 <s2+s1;});
std::string ans;
for(int i = 0; i < strs.size(); i++)
{
ans += strs[i];
}
return ans;
}
11.解密数字
class Solution {
public:
int crackNumber(int ciphertext) {
string s = to_string(ciphertext);
int a = 1, b = 1, len = s.size();
if(len <2)
{
return 1;
}
for(int i = 2; i <= len; i++)
{
string tmp = s.substr(i-2, 2);
int c = 0;
if(tmp >= "10" && tmp <= "25")
{
c = a+b;
}
else
{
c = a;
}
b=a;
a=c;
}
return a;
}
};
12.回文子串
class Solution {
public:
int countSubstrings(string s) {
int res = 0;
int len = s.size();
for (int i = 0; i < len; ++i) {
res += extend(s, i, i, len); // 一个元素作为中心点:一个元素也为回文子串
res += extend(s, i, i + 1, len); // 两个元素作为中心点
}
return res;
}
// 从中心向两边找回文字符串
int extend(const string& s, int i, int j, int n) {
int res = 0;
while (i >= 0 && j < n && s[i] == s[j]) {
res++;
i--;
j++;
}
return res;
}
};
13.复原IP地址
std::vector<std::string> restoreIpAddress(std::string s)
{
std::vector<std::string> ret;
std::string ans;
for(int a = 1; a <= 3; a++)
for(int b = 1; b <= 3; b++)
for(int c = 1; c <= 3; c++)
for(int d = 1; d <= 3; d++)
{
if(a+b+c+d == s.size())
{
int A = std::atoi(s.substr(0,a));
int B = std::atoi(s.substr(a,b));
int C = std::atoi(s.substr(b,c));
int D = std::atoi(s.substr(c,d));
if(A<=255 && B<=255 && C<=255 && D<=255)
{
ans = std::to_string(A)+"."+std::to_string(B)+"."+std::to_string(C)+"."+std::to_string(D);
if(ans.length() == s.size()+3)
{
ret.push_back(ans);
}
}
}
}
return ret;
}
14.盛最多容器的水
int maxArea(std::vector<int> &height)
{
int l = 0, r = height.size()-1;
int res = 0;
while(l < r)
{
int area = std::min(height[l], height[r])*(r-l);
res = std::max(res, area);
//更新较短的边长
if(height[l] <= height[r])
{
l++;
}
else
{
r--;
}
}
return res;
}