leecode保存 简单题到ZY转换
2020-01-19 09:27 kk20161206 阅读(185) 评论(0) 收藏 举报//#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <stdio.h>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <sstream>
using namespace std;
class ListNode {
public:
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
static void print(ListNode* node)
{
if (node == nullptr)
{
return;
}
std::cout << node->val << " " << std::endl;
while(node->next != nullptr)
{
node = node->next;
std::cout << node->val << " " << std::endl;
}
}
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
static void print(TreeNode* node)
{
if (node == nullptr)
{
std::cout << " null " << std::endl;
}
std::cout << node->val << " " << std::endl;
/*if (node->left != nullptr)
{
node = node->next;
std::cout << node->val << " " << std::endl;
}*/
}
static void print(vector<vector<int>> vec)
{
for (int i = 0; i < vec.size(); i++)
{
for (int j = 0; j < vec[i].size(); j++)
{
cout << vec[i][j] << " " << endl;
}
cout << " 第 " << i << " 行 " << endl;
cout << endl;
}
}
static void print(vector<int> vec)
{
for (int j = 0; j < vec.size(); j++)
{
cout << vec[j] << " " << endl;
}
}
class Solution
{
public:
#pragma region RomanToInt
/*给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1 :
输入: "abcabcbb"
输出 : 3
解释 : 因为无重复字符的最长子串是 "abc",所以其长度为 3。
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
*/
/*int lengthOfLongestSubstring(string s)
{
for (int i = 0; i < s.length() - 1; i++)
{
for (int j = 1; j < s.length() - 2; j++)
{
string subStr = s.substr(i, j - i + 1);
}
}
}*/
int romanToInt(string s)
{
int value = 0;
int currentValue = 0;
for (int i = 0; i < s.length(); i++)
{
char ch = s[i];
switch (ch)
{
case 'I':
if ((i + 1) <= s.length() - 1)
{
switch (s[i + 1])
{
case 'V':
i++;
currentValue = 4;
break;
case 'X':
i++;
currentValue = 9;
break;
default:
currentValue = 1;
break;
}
}
else
{
currentValue = 1;
}
break;
case 'V':
currentValue = 5;
break;
case 'X':
if ((i + 1) <= s.length() - 1)
{
switch (s[i + 1])
{
case 'L':
i++;
currentValue = 40;
break;
case 'C':
currentValue = 90;
i++;
break;
default:
currentValue = 10;
break;
}
}
else
{
currentValue = 10;
}
break;
case 'L':
currentValue = 50;
break;
case 'C':
if ((i + 1) <= s.length() - 1)
{
switch (s[i + 1])
{
case 'D':
i++;
currentValue = 400;
break;
case 'M':
currentValue = 900;
i++;
break;
default:
currentValue = 100;
break;
}
}
else
{
currentValue = 100;
}
break;
case 'D':
currentValue = 500;
break;
case 'M':
currentValue = 1000;
break;
}
value += currentValue;
}
return value;
}
#pragma endregion
ListNode* deleteDuplicates(ListNode* head) {
/*if (head == nullptr)
{
return nullptr;
}*/
ListNode* HeadNode = head;
while (head != nullptr && head->next != nullptr)
{
if (head->next->val == head->val)
{
head->next = head->next->next;
}
else
{
head = head->next;
}
}
return HeadNode;
}
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n)
{
if (n == 0)
{
return;
}
if (m == 0)
{
nums1 = nums2;
return;
}
int p1 = m - 1;
int p2 = n - 1;
int p = m + n - 1;
while ((p1 >= 0) && (p2 >= 0))
{
nums1[p--] = nums1[p1] >= nums2[p2] ? nums1[p1--] : nums2[p2--];
}
while (p2 >= 0)
{
nums1[p--] = nums2[p2--];
}
while (p1 >= 0)
{
nums1[p--] = nums1[p1--];
}
}
string longestCommonPrefix(vector<string>& strs) {
}
bool isSameTree(TreeNode* p, TreeNode* q) {
if (p == nullptr && q == nullptr)
{
return true;
}
if (p == nullptr || q == nullptr)
{
return false;
}
if (p->val != q->val)
{
return false;
}
return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
bool isMirror(TreeNode* t1, TreeNode* t2)
{
if (t1 == nullptr && t2 == nullptr)
{
return true;
}
if (t1 == nullptr || t2 == nullptr)
{
return false;
}
return (t1->val == t2->val) && isMirror(t1->left, t2->right) && isMirror(t1->right, t2->left);
}
bool isSymmetric(TreeNode* root)
{
return isMirror(root, root);
}
int maxDepth(TreeNode* root) {
if (root == nullptr)
{
return 0;
}
int leftDepth = maxDepth(root->left);
int rightDepth = maxDepth(root->right);
return 1 + (leftDepth > rightDepth ? leftDepth : rightDepth);
}
string addBinary(string a, string b) {
if (a.empty() && b.empty())
{
return "0";
}
if (a.empty())
{
return b;
}
if (b.empty())
{
return a;
}
int aLen = a.length();
int bLen = b.length();
int cLen = aLen >= bLen ? aLen : bLen;
cLen += 1;
string c(cLen, '0');
int sum = 0;
int carry = 0;
int curAIndex = 0;
int curBIndex = 0;
int curAValue = 0;
int curBValue = 0;
for (int i = 0; i < cLen - 1; i++)
{
curAIndex = aLen - 1 - i;
curBIndex = bLen - 1 - i;
curAValue = curAIndex < 0 ? 0 : a[curAIndex] - '0';
curBValue = curBIndex < 0 ? 0 : b[curBIndex] - '0';
sum = (curAValue + curBValue + carry) % 2;
carry = (curAValue + curBValue + carry) / 2;
c[cLen - 1 - i] = sum + '0';
}
if (carry == 0)
{
c = c.substr(1);
}
else
{
c[0] = carry + '0';
}
return c;
}
string addBinaryNew(string a, string b)
{
int aLen = a.length();
int bLen = b.length();
while (aLen < bLen)
{
a = '0' + a;
aLen++;
}
while (bLen < aLen)
{
b = '0' + b;
bLen++;
}
for (int i = aLen - 1; i > 0; i--)
{
a[i - 1] = ((a[i] - '0') + (b[i] - '0')) / 2 + a[i - 1];
a[i] = ((a[i] - '0') + (b[i] - '0')) % 2 + '0';
}
a[0] = a[0] + b[0] - '0';
if (a[0] >= '2')
{
a[0] = (a[0] - '0') % 2 + '0';
a = '1' + a;
}
return a;
}
int mySqrt(int x)
{
if (x == 0)
{
return x;
}
else if (x == 2 || x == 3)
{
return 1;
}
else if (x == 4)
{
return 2;
}
else
{
int left = 0;
int right = (x == 2147483647) ? (x/2+1) : (x + 1) / 2;
int value = (left + right) / 2;
value = (value > 46340) ? 46340 : value;
int squre = value * value;
while (left < right)
{
if (squre < x)
{
if (value >= 46340)
{
return 46340;
}
left = value;
value = (left + right + 1) / 2;
}
else if (value * value > x)
{
right = value - 1;
value = (left + right + 1) / 2;
}
else
{
return value;
}
squre = value * value;
}
return left;
}
}
int climbStairs(int n) {
if (n <= 2)
{
return n;
}
int first = 1;
int second = 2;
int value = 0;
for (int i = 3; i <= n; i++)
{
value = first + second;
first = second;
second = value;
}
return second;
}
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<int> vec;
vector<vector<int>> result;
if (root == nullptr)
{
return result;
}
queue<TreeNode*> queue;
queue.push(root);
while (!queue.empty())
{
vector<int> oneLevel;
int size = queue.size();
for (int i = 0; i < size; i++)
{
TreeNode* node = queue.front();
oneLevel.push_back(node->val);
queue.pop();
if (node->left != nullptr)
{
queue.push(node->left);
}
if (node->right != nullptr)
{
queue.push(node->right);
}
}
result.insert(result.begin(), oneLevel);
}
return result;
}
TreeNode* sortedArrayToBST(vector<int>& nums) {
if (nums.size() == 0)
{
return nullptr;
}
if (nums.size() == 1)
{
TreeNode* A = new TreeNode(nums[0]);
return A;
}
int num = nums.size() / 2;
std::vector<int> leftVector(num);
std::copy(nums.begin(), nums.begin() + num, leftVector.begin());
std::vector<int> rightVector(nums.size() - num - 1);
std::copy(nums.begin() + num + 1, nums.end(), rightVector.begin());
TreeNode* A = new TreeNode(nums[num]);
A->left = sortedArrayToBST(leftVector);
A->right = sortedArrayToBST(rightVector);
return A;
}
bool isBalanced(TreeNode* root) {
if (root == nullptr)
{
return true;
}
if (root->left == nullptr && root->right == nullptr)
{
return true;
}
int leftHeight = maxDepth(root->left);
int rightHeight = maxDepth(root->right);
int sub = leftHeight > rightHeight ? leftHeight - rightHeight : rightHeight - leftHeight;
return sub <= 1 && isBalanced(root->left) && isBalanced(root->right);
}
bool isBalanced1(TreeNode* root) {
bool balance = false;
int h = 0;
return Balance(root, h);
}
bool Balance(TreeNode* root, int &h)
{
if (root == NULL)
{
h = 0;
return true;
}
if (root->left == NULL && root->right == NULL)
{
h = 1;
return true;
}
int hr, hl;
bool br = Balance(root->left, hl);
bool bl = Balance(root->right, hr);
h = (hl > hr ? hl : hr) + 1;//三目运算符
if (abs(hl - hr) < 2)
return br & bl;
return false;
}
int minDepth(TreeNode* root)
{
if (root == nullptr)
{
return 0;
}
if (root->left == nullptr && root->right == nullptr)
{
return 1;
}
if (root->left == nullptr && root->right != nullptr)
{
return minDepth(root->right) + 1;
}
if (root->left != nullptr && root->right == nullptr)
{
return minDepth(root->left) + 1;
}
int depthL = minDepth(root->left);
int depthR = minDepth(root->right);
int depth = depthL > depthR ? depthR : depthL;
depth += 1;
return depth;
}
bool hasPathSum(TreeNode* root, int sum) {
if (root == nullptr)
{
return false;
}
if (root->left == nullptr && root->right == nullptr)
{
if (root->val == sum)
return true;
else
return false;
}
if (root->left == nullptr && root->right != nullptr)
{
return hasPathSum(root->right, sum - root->val);
}
if (root->left != nullptr && root->right == nullptr)
{
return hasPathSum(root->left, sum - root->val);
}
if (root->left != nullptr && root->right != nullptr)
{
return hasPathSum(root->right, sum - root->val) || hasPathSum(root->left, sum - root->val);
}
}
vector<vector<int>> generate(int numRows) {
if (numRows == 0)
{
vector<vector<int>> result{};
return result;
}
if (numRows == 1)
{
vector<int> row{ 1 };
vector<vector<int>> result{ row };
return result;
}
if (numRows == 2)
{
vector<int> row0{ 1 };
vector<int> row1{ 1 , 1};
vector<vector<int>> result{ row0, row1 };
return result;
}
vector<vector<int>> resultRowM1 = generate(numRows - 1);
vector<int> RowM(numRows, 1);
vector<int> RowM1 = resultRowM1[numRows - 2];
for (int i = 1; i < (numRows + 1)/2; i++)
{
RowM[i] = RowM1[i - 1] + RowM1[i];
RowM[numRows - 1 - i] = RowM[i];
}
resultRowM1.push_back(RowM);
return resultRowM1;
}
vector<int> getRow(int rowIndex) {
if (rowIndex == 0)
{
vector<int> row{ 1 };
return row;
}
if (rowIndex == 1)
{
vector<int> row1{ 1 , 1 };
return row1;
}
if (rowIndex == 2)
{
vector<int> row1{ 1 , 2, 1 };
return row1;
}
vector<int> RowM1 = getRow(rowIndex - 1);
RowM1.push_back(1);
for (int i = rowIndex / 2; i >= 1; i--)
{
RowM1[i] = RowM1[i - 1] + RowM1[i];
RowM1[rowIndex - i] = RowM1[i];
}
return RowM1;
}
int maxProfit(vector<int>& prices) {
int max = 0;
for (int i = 0; i < prices.size(); i++)
{
for (int j = i + 1; j < prices.size(); j++)
{
if (prices[j] - prices[i] > max)
{
max = prices[j] - prices[i];
}
}
}
return max;
}
int maxProfit1(vector<int>& prices) {
if (prices.size() <= 0)
return 0;
int min = prices[0];
int sum = 0;
for (int i = 1; i < prices.size(); i++)
{
if (prices[i] > min)
{
sum += prices[i] - min;
min = prices[i];
}
if (prices[i] < min)
{
min = prices[i];
}
}
return sum;
}
bool isNumOrCharacter(char& ch)
{
return ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9'));
}
void turnLowerCharacter(char& ch)
{
if (ch >= 'A' && ch <= 'Z')
ch = ch + 'a' - 'A';
return;
}
bool isPalindrome(string s) {
if (s.size() == 0)
return true;
for (int i = 0, j = s.size() - 1; i <= j;)
{
if (!isNumOrCharacter(s[i]))
{
i++;
continue;
}
if (!isNumOrCharacter(s[j]))
{
j--;
continue;
}
if (s[i] >= '0' && s[i] <= '9')
{
if (s[i] != s[j])
return false;
else {
i++;
j--;
}
}
else {
turnLowerCharacter(s[i]);
turnLowerCharacter(s[j]);
if (s[i] != s[j])
return false;
else {
i++;
j--;
}
}
}
return true;
}
int singleNumber(vector<int>& nums) {
if (nums.size() == 0)
{
return 0;
}
if (nums.size() == 1)
{
return nums[0];
}
int sum = nums[0];
for (int i = 1; i < nums.size(); i++)
{
sum ^= nums[i];
}
return sum;
}
bool hasCycle(ListNode *head) {
ListNode* head1 = head;
while (head1 != nullptr && head->next != nullptr && head1->next != nullptr)
{
head = head->next;
head1 = head1->next->next;
if (head == head1)
return true;
}
return false;
}
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode *headBPtr = headB;
ListNode *headAPtr = headA;
while (headAPtr != headBPtr)
{
headAPtr = headAPtr == nullptr ? headB : headAPtr->next;
headBPtr = headBPtr == nullptr ? headA : headBPtr->next;
}
return headAPtr;
}
vector<int> twoSum(vector<int>& numbers, int target) {
vector<int> sum;
for (int i = 0, j = numbers.size() - 1; i <= j;)
{
if (numbers[i] + numbers[j] < target)
{
i++;
}
else if (numbers[i] + numbers[j] > target)
{
j--;
}
else
{
sum.push_back(i+1);
sum.push_back(j+1);
return sum;
}
}
return sum;
}
string convertToTitle(int n) {
string res;
while (n)
{
char c = 'A' + --n % 26;; // 'Z';
res += c;
n = n / 26;
}
reverse(res.begin(), res.end());
return res;
}
int titleToNumber(string s) {
int sum = 0;
for (int i = 0; i < s.size(); i++)
{
sum = sum * 26 + s[i] - 'A' + 1;
}
return sum;
}
};
class MinStack {
public:
/** initialize your data structure here. */
MinStack() {
mList = NULL;
}
void push(int x) {
mStack.push(x);
if (mList == nullptr)
{
mList = new ListNode(x);
mList->val = x;
mList->next = nullptr;
return;
}
if (mList->val >= x)
{
ListNode* node = new ListNode(x);
node->next = mList;
mList = node;
return;
}
else
{
ListNode* prev = mList;
ListNode* current = mList->next;
while (prev->val <= x)
{
if (current == nullptr)
{
ListNode* node = new ListNode(x);
prev->next = node;
return;
}
else
{
if (current->val <= x)
{
current = current->next;
prev = prev->next;
}
else
{
ListNode* node = new ListNode(x);
node->next = current;
prev->next = node;
return;
}
}
}
}
}
void pop() {
int top = mStack.top();
mStack.pop();
if (mList->val == top)
{
mList = mList->next;
return;
}
ListNode * prev = mList;
ListNode * current = mList;
while (current != nullptr)
{
if (current->val == top)
{
prev->next = current->next;
current = nullptr;
delete current;
return;
}
else
{
prev = prev->next;
current = current->next;
}
}
}
int top() {
return mStack.top();
}
int getMin() {
return mList->val;
}
private:
stack<int> mStack;
ListNode* mList;
};
int main(int, char[])
{
Solution *s = new Solution();
//string str = "MCMXCIV";
//int value = s->romanToInt(str); // III:3, IV:4, IX:9, LVIII:58, MCMXCIV:1994
//string value = s->addBinaryNew("1001", "1011");
//int sqrt = s->mySqrt(2147483647);
//int stairs = s->climbStairs(3);
//printf("Hello: %s!\n", value);
//std::cout << "++++++ +++++: " << stairs;
/*ListNode* node = new ListNode(1);
ListNode* node1 = new ListNode(1);
ListNode* node2 = new ListNode(2);
ListNode* node3 = new ListNode(3);
ListNode* node4 = new ListNode(3);
node->next = node1;
node1->next = node2;
node2->next = node3;
node3->next = node4;
ListNode* nodeResult = s->deleteDuplicates(node);
print(nodeResult);*/
/*vector<int> a = { 1, 2, 3, 0, 0, 0 };
vector<int> b = { 2, 5, 6 };
s->merge(a, 3, b, 3);
for (int i = 0; i < a.size(); i++)
{
std::cout << "++++++ +++++: " << a[i] << std::endl;
}*/
/*TreeNode{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}*/
//TreeNode* A = new TreeNode(1);
//TreeNode* B1 = new TreeNode(2);
//TreeNode* B2 = new TreeNode(2);
//TreeNode* C1 = new TreeNode(3);
//TreeNode* C2 = new TreeNode(4);
//TreeNode* C3 = new TreeNode(4);
//TreeNode* C4 = new TreeNode(3);
//B1->left = C1;
//B1->right = C2;
//B2->left = C3;
//B2->right = nullptr;
//A->left = B1;
//A->right = B2;
///*bool isSame = s->isSameTree(A, B);
//std::cout << isSame << std::endl;*/
//bool isSymmetric = s->isSymmetric(A);
//std::cout << isSymmetric << std::endl;
//TreeNode* A = new TreeNode(3);
//TreeNode* B1 = new TreeNode(9);
//TreeNode* B2 = new TreeNode(20);
//TreeNode* C1 = new TreeNode(15);
//TreeNode* C2 = new TreeNode(7);
//A->left = B1;
//A->right = B2;
//B1->left = nullptr;
//B1->right = nullptr;
//B2->left = C1;
//B2->right = C2;
///*int depth = s->maxDepth(A);
//std::cout << depth << std::endl;*/
//vector<vector<int>> vector = s->levelOrderBottom(A);
//for (int i = 0; i < vector.size(); i++)
//{
// for (int j = 0; j < vector[i].size(); j++)
// {
// cout << "第 " << i << " 层, 第 " << j << " 列 : " << vector[i][j] << std::endl;
// }
// cout << " " << std::endl;
//}
/*vector<int> vec = { -10, -3, 0, 5, 9 };
TreeNode* tree = s->sortedArrayToBST(vec);
vector<vector<int>> vector = s->levelOrderBottom(tree);
for (int i = 0; i < vector.size(); i++)
{
for (int j = 0; j < vector[i].size(); j++)
{
cout << "第 " << i << " 层, 第 " << j << " 列 : " << vector[i][j] << std::endl;
}
cout << " " << std::endl;
}*/
/*TreeNode* A = new TreeNode(3);
TreeNode* B1 = new TreeNode(9);
TreeNode* B2 = new TreeNode(20);
TreeNode* C1 = new TreeNode(15);
TreeNode* C2 = new TreeNode(7);
TreeNode* C3 = new TreeNode(13);
A->left = B1;
A->right = B2;
B1->left = nullptr;
B1->right = nullptr;
B2->left = C1;
B2->right = C2;
bool isBalanced = s->isBalanced(A);*/
/*TreeNode* A = new TreeNode(1);
TreeNode* B1 = new TreeNode(2);
TreeNode* B2 = new TreeNode(2);
TreeNode* C1 = new TreeNode(3);
TreeNode* C2 = new TreeNode(3);
TreeNode* D1 = new TreeNode(4);
TreeNode* D2 = new TreeNode(4);
C1->left = D1;
C1->right = D2;
A->left = B1;
A->right = B2;
B1->left = C1;
B1->right = C2;*/
/*TreeNode* A = new TreeNode(1);
TreeNode* B = new TreeNode(2);
TreeNode* C = new TreeNode(3);
TreeNode* D = new TreeNode(4);
TreeNode* E = new TreeNode(5);
A->left = B;
A->right = nullptr;
B->left = C;
C->left = D;
D->right = E;*/
/*TreeNode* A = new TreeNode(5);
TreeNode* B1 = new TreeNode(4);
TreeNode* B2 = new TreeNode(8);
TreeNode* C1 = new TreeNode(11);
TreeNode* C3 = new TreeNode(13);
TreeNode* C4 = new TreeNode(4);
TreeNode* D1 = new TreeNode(7);
TreeNode* D2 = new TreeNode(2);
TreeNode* D3 = new TreeNode(1);
A->left = B1;
A->right = B2;
B1->left = C1;
B2->left = C3;
B2->right = C4;
C1->left = D1;
C1->right = D2;
C4->right = D3;*/
/*bool isBalanced = s->isBalanced1(A);
cout << " " << isBalanced << std::endl;*/
/*int depth = s->minDepth(A);
cout << " " << depth << std::endl;*/
/*bool isExist = s->hasPathSum(A, 22);
cout << " " << isExist << std::endl;*/
/*vector<vector<int>> res = s->generate(5);
print(res);*/
/*vector<int> res = s->getRow(4);
print(res);*/
//vector<int> prices{ 1,2,3,4,5 };
////int max = s->maxProfit(prices);
//int max1 = s->maxProfit1(prices);
//cout << max1 << endl;
/*bool flag = s->isPalindrome("A man, a plan, a canal: Panama");
cout << flag << endl;*/
/*vector<int> vec{ 3, 2, 2 };
int x = s->singleNumber(vec);
cout << x << endl;*/
/*ListNode *A0 = new ListNode(0);
ListNode *A1 = new ListNode(1);
ListNode *A2 = new ListNode(2);
ListNode *A3 = new ListNode(3);
A0->next = A1;
A1->next = A2;
A2->next = A3;
A3->next = nullptr;
bool flag = s->hasCycle(A0);
cout << flag << endl;*/
/*MinStack* obj = new MinStack();
obj->push(2);
obj->push(0);
obj->push(3);
obj->push(0);
cout << obj->getMin() << " " << endl;
obj->pop();
cout << obj->getMin() << " " << obj->top() << endl;
obj->pop();
cout << obj->getMin() << " " << obj->top() << endl;*/
/*ListNode* A1 = new ListNode(1);
ListNode* A2 = new ListNode(2);
ListNode* B1 = new ListNode(4);
ListNode* B2 = new ListNode(1);
ListNode* B3 = new ListNode(8);
ListNode* C1 = new ListNode(4);
ListNode* C2 = new ListNode(3);
A1->next = A2;
A2->next = C1;
B1->next = B2;
B2->next = B3;
B3->next = C1;
C1->next = C2;
ListNode* node = s->getIntersectionNode(A1, B1);
print(node);*/
/*vector<int> vec{ 2, 7, 11, 15 };
vector<int> res = s->twoSum(vec, 9);
print(res);*/
/*string res = s->convertToTitle(52);
cout << res << endl;*/
int sum = s->titleToNumber("ZY");
cout << sum << endl;
system("pause");
return 0;
}
//#include "stdafx.h"#include <iostream>#include <cstdlib>#include <stdio.h>#include <string>#include <vector>#include <stack>#include <queue>#include <sstream>using namespace std;
class ListNode {public:int val;ListNode *next;ListNode(int x) : val(x), next(NULL) {}};
static void print(ListNode* node){if (node == nullptr){return;}std::cout << node->val << " " << std::endl;while(node->next != nullptr){node = node->next;std::cout << node->val << " " << std::endl;}}
struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode(int x) : val(x), left(NULL), right(NULL) {}};
static void print(TreeNode* node){if (node == nullptr){std::cout << " null " << std::endl;}std::cout << node->val << " " << std::endl;/*if (node->left != nullptr){node = node->next;std::cout << node->val << " " << std::endl;}*/}
static void print(vector<vector<int>> vec){for (int i = 0; i < vec.size(); i++){for (int j = 0; j < vec[i].size(); j++){cout << vec[i][j] << " " << endl;}cout << " 第 " << i << " 行 " << endl;cout << endl;}}
static void print(vector<int> vec){for (int j = 0; j < vec.size(); j++){cout << vec[j] << " " << endl;}}
class Solution{public:#pragma region RomanToInt/*给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1 :
输入: "abcabcbb"输出 : 3解释 : 因为无重复字符的最长子串是 "abc",所以其长度为 3。
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
*/
/*int lengthOfLongestSubstring(string s){for (int i = 0; i < s.length() - 1; i++){for (int j = 1; j < s.length() - 2; j++){string subStr = s.substr(i, j - i + 1);}}}*/int romanToInt(string s){int value = 0;int currentValue = 0;for (int i = 0; i < s.length(); i++){char ch = s[i];switch (ch){case 'I':if ((i + 1) <= s.length() - 1){switch (s[i + 1]){case 'V':i++;currentValue = 4;break;case 'X':i++;currentValue = 9;break;default:currentValue = 1;break;}}else{currentValue = 1;}break;case 'V':currentValue = 5;break;case 'X':if ((i + 1) <= s.length() - 1){switch (s[i + 1]){case 'L':i++;currentValue = 40;break;case 'C':currentValue = 90;i++;break;default:currentValue = 10;break;}}else{currentValue = 10;}break;case 'L':currentValue = 50;break;case 'C':if ((i + 1) <= s.length() - 1){switch (s[i + 1]){case 'D':i++;currentValue = 400;break;case 'M':currentValue = 900;i++;break;default:currentValue = 100;break;}}else{currentValue = 100;}break;case 'D':currentValue = 500;break;case 'M':currentValue = 1000;break;}value += currentValue;}return value;}#pragma endregion
ListNode* deleteDuplicates(ListNode* head) {/*if (head == nullptr){return nullptr;}*/ListNode* HeadNode = head;while (head != nullptr && head->next != nullptr){if (head->next->val == head->val){head->next = head->next->next;}else{head = head->next;}}return HeadNode;}
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {if (n == 0){return;}if (m == 0){nums1 = nums2;return;}int p1 = m - 1;int p2 = n - 1;int p = m + n - 1;while ((p1 >= 0) && (p2 >= 0)){nums1[p--] = nums1[p1] >= nums2[p2] ? nums1[p1--] : nums2[p2--];}while (p2 >= 0){nums1[p--] = nums2[p2--];}while (p1 >= 0){nums1[p--] = nums1[p1--];}}
string longestCommonPrefix(vector<string>& strs) {
}
bool isSameTree(TreeNode* p, TreeNode* q) {if (p == nullptr && q == nullptr){return true;}if (p == nullptr || q == nullptr){return false;}if (p->val != q->val){return false;}return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);}
bool isMirror(TreeNode* t1, TreeNode* t2){if (t1 == nullptr && t2 == nullptr){return true;}if (t1 == nullptr || t2 == nullptr){return false;}
return (t1->val == t2->val) && isMirror(t1->left, t2->right) && isMirror(t1->right, t2->left);}
bool isSymmetric(TreeNode* root) {return isMirror(root, root);}
int maxDepth(TreeNode* root) {if (root == nullptr){return 0;}int leftDepth = maxDepth(root->left);int rightDepth = maxDepth(root->right);return 1 + (leftDepth > rightDepth ? leftDepth : rightDepth);}
string addBinary(string a, string b) {if (a.empty() && b.empty()){return "0";}if (a.empty()){return b;}if (b.empty()){return a;}int aLen = a.length();int bLen = b.length();int cLen = aLen >= bLen ? aLen : bLen;cLen += 1;string c(cLen, '0');int sum = 0;int carry = 0;int curAIndex = 0;int curBIndex = 0;int curAValue = 0;int curBValue = 0;for (int i = 0; i < cLen - 1; i++){curAIndex = aLen - 1 - i;curBIndex = bLen - 1 - i;curAValue = curAIndex < 0 ? 0 : a[curAIndex] - '0';curBValue = curBIndex < 0 ? 0 : b[curBIndex] - '0';sum = (curAValue + curBValue + carry) % 2;carry = (curAValue + curBValue + carry) / 2;c[cLen - 1 - i] = sum + '0';}if (carry == 0){c = c.substr(1);}else{c[0] = carry + '0';}return c;}
string addBinaryNew(string a, string b){int aLen = a.length();int bLen = b.length();while (aLen < bLen){a = '0' + a;aLen++;}while (bLen < aLen){b = '0' + b;bLen++;}for (int i = aLen - 1; i > 0; i--){a[i - 1] = ((a[i] - '0') + (b[i] - '0')) / 2 + a[i - 1];a[i] = ((a[i] - '0') + (b[i] - '0')) % 2 + '0';}a[0] = a[0] + b[0] - '0';if (a[0] >= '2'){a[0] = (a[0] - '0') % 2 + '0';a = '1' + a;}return a;}
int mySqrt(int x){
if (x == 0){return x;}else if (x == 2 || x == 3){return 1;}else if (x == 4){return 2;}else{int left = 0;int right = (x == 2147483647) ? (x/2+1) : (x + 1) / 2;int value = (left + right) / 2;value = (value > 46340) ? 46340 : value;int squre = value * value;while (left < right){if (squre < x){if (value >= 46340){return 46340;}left = value;value = (left + right + 1) / 2;}else if (value * value > x){right = value - 1;value = (left + right + 1) / 2;}else{return value;}squre = value * value;}return left;}}
int climbStairs(int n) {if (n <= 2){return n;}int first = 1;int second = 2;int value = 0;for (int i = 3; i <= n; i++){value = first + second;first = second;second = value;}return second;}
vector<vector<int>> levelOrderBottom(TreeNode* root) {vector<int> vec;vector<vector<int>> result;if (root == nullptr){return result;}
queue<TreeNode*> queue;queue.push(root);while (!queue.empty()){vector<int> oneLevel;int size = queue.size();for (int i = 0; i < size; i++){TreeNode* node = queue.front();oneLevel.push_back(node->val);queue.pop();if (node->left != nullptr){queue.push(node->left);}if (node->right != nullptr){queue.push(node->right);}}result.insert(result.begin(), oneLevel);}return result;}
TreeNode* sortedArrayToBST(vector<int>& nums) {if (nums.size() == 0){return nullptr;}if (nums.size() == 1){TreeNode* A = new TreeNode(nums[0]);return A;}int num = nums.size() / 2;std::vector<int> leftVector(num);std::copy(nums.begin(), nums.begin() + num, leftVector.begin());std::vector<int> rightVector(nums.size() - num - 1);std::copy(nums.begin() + num + 1, nums.end(), rightVector.begin());TreeNode* A = new TreeNode(nums[num]);A->left = sortedArrayToBST(leftVector);A->right = sortedArrayToBST(rightVector);return A;}
bool isBalanced(TreeNode* root) {if (root == nullptr){return true;}if (root->left == nullptr && root->right == nullptr){return true;}int leftHeight = maxDepth(root->left);int rightHeight = maxDepth(root->right);int sub = leftHeight > rightHeight ? leftHeight - rightHeight : rightHeight - leftHeight;return sub <= 1 && isBalanced(root->left) && isBalanced(root->right);}
bool isBalanced1(TreeNode* root) {bool balance = false;int h = 0;return Balance(root, h);}bool Balance(TreeNode* root, int &h){if (root == NULL){h = 0;return true;}if (root->left == NULL && root->right == NULL){h = 1;return true;}int hr, hl;bool br = Balance(root->left, hl);bool bl = Balance(root->right, hr);h = (hl > hr ? hl : hr) + 1;//三目运算符if (abs(hl - hr) < 2)return br & bl;return false;}
int minDepth(TreeNode* root) {if (root == nullptr){return 0;}if (root->left == nullptr && root->right == nullptr){return 1;}if (root->left == nullptr && root->right != nullptr){return minDepth(root->right) + 1;}if (root->left != nullptr && root->right == nullptr){return minDepth(root->left) + 1;}int depthL = minDepth(root->left);int depthR = minDepth(root->right);int depth = depthL > depthR ? depthR : depthL;depth += 1;return depth;}
bool hasPathSum(TreeNode* root, int sum) {if (root == nullptr){return false;}if (root->left == nullptr && root->right == nullptr){if (root->val == sum)return true;elsereturn false;}if (root->left == nullptr && root->right != nullptr){return hasPathSum(root->right, sum - root->val);}if (root->left != nullptr && root->right == nullptr){return hasPathSum(root->left, sum - root->val);}if (root->left != nullptr && root->right != nullptr){return hasPathSum(root->right, sum - root->val) || hasPathSum(root->left, sum - root->val);}}
vector<vector<int>> generate(int numRows) {if (numRows == 0){vector<vector<int>> result{};return result;}if (numRows == 1){vector<int> row{ 1 };vector<vector<int>> result{ row };return result;}if (numRows == 2){vector<int> row0{ 1 };vector<int> row1{ 1 , 1};vector<vector<int>> result{ row0, row1 };return result;}vector<vector<int>> resultRowM1 = generate(numRows - 1);vector<int> RowM(numRows, 1);vector<int> RowM1 = resultRowM1[numRows - 2];for (int i = 1; i < (numRows + 1)/2; i++){RowM[i] = RowM1[i - 1] + RowM1[i];RowM[numRows - 1 - i] = RowM[i];}resultRowM1.push_back(RowM);return resultRowM1;}
vector<int> getRow(int rowIndex) {if (rowIndex == 0){vector<int> row{ 1 };return row;}if (rowIndex == 1){vector<int> row1{ 1 , 1 };return row1;}if (rowIndex == 2){vector<int> row1{ 1 , 2, 1 };return row1;}vector<int> RowM1 = getRow(rowIndex - 1);RowM1.push_back(1);for (int i = rowIndex / 2; i >= 1; i--){RowM1[i] = RowM1[i - 1] + RowM1[i];RowM1[rowIndex - i] = RowM1[i];}return RowM1;}int maxProfit(vector<int>& prices) {int max = 0;for (int i = 0; i < prices.size(); i++){for (int j = i + 1; j < prices.size(); j++){if (prices[j] - prices[i] > max){max = prices[j] - prices[i];}}}return max;}
int maxProfit1(vector<int>& prices) {if (prices.size() <= 0)return 0;int min = prices[0];int sum = 0;for (int i = 1; i < prices.size(); i++){if (prices[i] > min){sum += prices[i] - min;min = prices[i];}if (prices[i] < min){min = prices[i];}}return sum;}
bool isNumOrCharacter(char& ch){return ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9'));}
void turnLowerCharacter(char& ch){if (ch >= 'A' && ch <= 'Z')ch = ch + 'a' - 'A';return;}
bool isPalindrome(string s) {if (s.size() == 0)return true;for (int i = 0, j = s.size() - 1; i <= j;){if (!isNumOrCharacter(s[i])){i++;continue;}if (!isNumOrCharacter(s[j])){j--;continue;}if (s[i] >= '0' && s[i] <= '9'){if (s[i] != s[j])return false;else {i++;j--;}}else {turnLowerCharacter(s[i]);turnLowerCharacter(s[j]);if (s[i] != s[j])return false;else {i++;j--;}}}return true;}
int singleNumber(vector<int>& nums) {if (nums.size() == 0){return 0;}if (nums.size() == 1){return nums[0];}int sum = nums[0];for (int i = 1; i < nums.size(); i++){sum ^= nums[i];}return sum;}
bool hasCycle(ListNode *head) {ListNode* head1 = head;while (head1 != nullptr && head->next != nullptr && head1->next != nullptr){head = head->next;head1 = head1->next->next;if (head == head1)return true;}return false;}
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {ListNode *headBPtr = headB;ListNode *headAPtr = headA;while (headAPtr != headBPtr){headAPtr = headAPtr == nullptr ? headB : headAPtr->next;headBPtr = headBPtr == nullptr ? headA : headBPtr->next;}return headAPtr;}
vector<int> twoSum(vector<int>& numbers, int target) {vector<int> sum;for (int i = 0, j = numbers.size() - 1; i <= j;){if (numbers[i] + numbers[j] < target){i++;}else if (numbers[i] + numbers[j] > target){j--;}else{sum.push_back(i+1);sum.push_back(j+1);return sum;}}return sum;}
string convertToTitle(int n) {string res;while (n){char c = 'A' + --n % 26;; // 'Z';res += c;n = n / 26;}reverse(res.begin(), res.end());return res;}
int titleToNumber(string s) {int sum = 0;for (int i = 0; i < s.size(); i++){sum = sum * 26 + s[i] - 'A' + 1;}return sum;}
};
class MinStack {public:/** initialize your data structure here. */MinStack() {mList = NULL;}
void push(int x) {mStack.push(x);if (mList == nullptr){mList = new ListNode(x);mList->val = x;mList->next = nullptr;return;}if (mList->val >= x){ListNode* node = new ListNode(x);node->next = mList;mList = node;return;}else{ListNode* prev = mList;ListNode* current = mList->next;while (prev->val <= x){if (current == nullptr){ListNode* node = new ListNode(x);prev->next = node;return;}else{if (current->val <= x){current = current->next;prev = prev->next;}else{ListNode* node = new ListNode(x);node->next = current;prev->next = node;return;}}}}}
void pop() {int top = mStack.top();mStack.pop();if (mList->val == top){mList = mList->next;return;}ListNode * prev = mList;ListNode * current = mList;while (current != nullptr){if (current->val == top){prev->next = current->next;current = nullptr;delete current;return;}else{prev = prev->next;current = current->next;}}}
int top() {return mStack.top();}
int getMin() {return mList->val;}private:stack<int> mStack;ListNode* mList;};
int main(int, char[]){Solution *s = new Solution();//string str = "MCMXCIV";//int value = s->romanToInt(str); // III:3, IV:4, IX:9, LVIII:58, MCMXCIV:1994//string value = s->addBinaryNew("1001", "1011");//int sqrt = s->mySqrt(2147483647);//int stairs = s->climbStairs(3);//printf("Hello: %s!\n", value);//std::cout << "++++++ +++++: " << stairs;
/*ListNode* node = new ListNode(1);ListNode* node1 = new ListNode(1);ListNode* node2 = new ListNode(2);ListNode* node3 = new ListNode(3);ListNode* node4 = new ListNode(3);node->next = node1;node1->next = node2;node2->next = node3;node3->next = node4;ListNode* nodeResult = s->deleteDuplicates(node);print(nodeResult);*/
/*vector<int> a = { 1, 2, 3, 0, 0, 0 };vector<int> b = { 2, 5, 6 };s->merge(a, 3, b, 3);for (int i = 0; i < a.size(); i++){std::cout << "++++++ +++++: " << a[i] << std::endl;}*/
/*TreeNode{int val;TreeNode *left;TreeNode *right;TreeNode(int x) : val(x), left(NULL), right(NULL) {}*/
//TreeNode* A = new TreeNode(1);//TreeNode* B1 = new TreeNode(2);//TreeNode* B2 = new TreeNode(2);
//TreeNode* C1 = new TreeNode(3);//TreeNode* C2 = new TreeNode(4);//TreeNode* C3 = new TreeNode(4);//TreeNode* C4 = new TreeNode(3);
//B1->left = C1;//B1->right = C2;
//B2->left = C3;//B2->right = nullptr;
//A->left = B1;//A->right = B2;///*bool isSame = s->isSameTree(A, B);//std::cout << isSame << std::endl;*/
//bool isSymmetric = s->isSymmetric(A);//std::cout << isSymmetric << std::endl;
//TreeNode* A = new TreeNode(3);//TreeNode* B1 = new TreeNode(9);//TreeNode* B2 = new TreeNode(20);
//TreeNode* C1 = new TreeNode(15);//TreeNode* C2 = new TreeNode(7);
//A->left = B1;//A->right = B2;
//B1->left = nullptr;//B1->right = nullptr;
//B2->left = C1;//B2->right = C2;
///*int depth = s->maxDepth(A);//std::cout << depth << std::endl;*/
//vector<vector<int>> vector = s->levelOrderBottom(A);//for (int i = 0; i < vector.size(); i++)//{//for (int j = 0; j < vector[i].size(); j++)//{//cout << "第 " << i << " 层, 第 " << j << " 列 : " << vector[i][j] << std::endl;//}//cout << " " << std::endl;//}
/*vector<int> vec = { -10, -3, 0, 5, 9 };TreeNode* tree = s->sortedArrayToBST(vec);
vector<vector<int>> vector = s->levelOrderBottom(tree);for (int i = 0; i < vector.size(); i++){for (int j = 0; j < vector[i].size(); j++){cout << "第 " << i << " 层, 第 " << j << " 列 : " << vector[i][j] << std::endl;}cout << " " << std::endl;}*/
/*TreeNode* A = new TreeNode(3);TreeNode* B1 = new TreeNode(9);TreeNode* B2 = new TreeNode(20);
TreeNode* C1 = new TreeNode(15);TreeNode* C2 = new TreeNode(7);
TreeNode* C3 = new TreeNode(13);A->left = B1;A->right = B2;
B1->left = nullptr;B1->right = nullptr;
B2->left = C1;B2->right = C2;bool isBalanced = s->isBalanced(A);*/
/*TreeNode* A = new TreeNode(1);TreeNode* B1 = new TreeNode(2);TreeNode* B2 = new TreeNode(2);
TreeNode* C1 = new TreeNode(3);TreeNode* C2 = new TreeNode(3);
TreeNode* D1 = new TreeNode(4);TreeNode* D2 = new TreeNode(4);
C1->left = D1;C1->right = D2;
A->left = B1;A->right = B2;
B1->left = C1;B1->right = C2;*/
/*TreeNode* A = new TreeNode(1);
TreeNode* B = new TreeNode(2);TreeNode* C = new TreeNode(3);TreeNode* D = new TreeNode(4);TreeNode* E = new TreeNode(5);A->left = B;A->right = nullptr;
B->left = C;
C->left = D;D->right = E;*/
/*TreeNode* A = new TreeNode(5);
TreeNode* B1 = new TreeNode(4);TreeNode* B2 = new TreeNode(8);
TreeNode* C1 = new TreeNode(11);TreeNode* C3 = new TreeNode(13);TreeNode* C4 = new TreeNode(4);
TreeNode* D1 = new TreeNode(7);TreeNode* D2 = new TreeNode(2);TreeNode* D3 = new TreeNode(1);
A->left = B1;A->right = B2;
B1->left = C1;
B2->left = C3;B2->right = C4;
C1->left = D1;C1->right = D2;
C4->right = D3;*/
/*bool isBalanced = s->isBalanced1(A);cout << " " << isBalanced << std::endl;*/
/*int depth = s->minDepth(A);cout << " " << depth << std::endl;*//*bool isExist = s->hasPathSum(A, 22);cout << " " << isExist << std::endl;*/
/*vector<vector<int>> res = s->generate(5);print(res);*/
/*vector<int> res = s->getRow(4);print(res);*/
//vector<int> prices{ 1,2,3,4,5 };////int max = s->maxProfit(prices);//int max1 = s->maxProfit1(prices);//cout << max1 << endl;
/*bool flag = s->isPalindrome("A man, a plan, a canal: Panama");cout << flag << endl;*/
/*vector<int> vec{ 3, 2, 2 };int x = s->singleNumber(vec);cout << x << endl;*/
/*ListNode *A0 = new ListNode(0);ListNode *A1 = new ListNode(1);ListNode *A2 = new ListNode(2);ListNode *A3 = new ListNode(3);A0->next = A1;A1->next = A2;A2->next = A3;A3->next = nullptr;bool flag = s->hasCycle(A0);cout << flag << endl;*/
/*MinStack* obj = new MinStack();obj->push(2);obj->push(0);obj->push(3);obj->push(0);cout << obj->getMin() << " " << endl;obj->pop();cout << obj->getMin() << " " << obj->top() << endl;obj->pop();cout << obj->getMin() << " " << obj->top() << endl;*/
/*ListNode* A1 = new ListNode(1);ListNode* A2 = new ListNode(2);ListNode* B1 = new ListNode(4);ListNode* B2 = new ListNode(1);ListNode* B3 = new ListNode(8);ListNode* C1 = new ListNode(4);ListNode* C2 = new ListNode(3);A1->next = A2;A2->next = C1;B1->next = B2;B2->next = B3;B3->next = C1;C1->next = C2;ListNode* node = s->getIntersectionNode(A1, B1);print(node);*/
/*vector<int> vec{ 2, 7, 11, 15 };vector<int> res = s->twoSum(vec, 9);print(res);*/
/*string res = s->convertToTitle(52);cout << res << endl;*/
int sum = s->titleToNumber("ZY");cout << sum << endl;system("pause");return 0;}
浙公网安备 33010602011771号