LeetCode--算法,简单级别1
Posted GongKiro
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode--算法,简单级别1相关的知识,希望对你有一定的参考价值。
#include "stdafx.h" #include "LeetCode_S.h" #include <unordered_map> #include <math.h> #include <stack> using namespace std; CLeetCode_Solution* CLeetCode_Solution::instance = NULL; CLeetCode_Solution::CLeetCode_Solution() { printf("Hello LeetCode "); } CLeetCode_Solution::~CLeetCode_Solution() { } /* 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] */ std::vector<int> CLeetCode_Solution::twoSum(vector<int>& nums, int target) { unordered_map<int, int> m; for (int i = 0; i < nums.size(); i++) { /* *for (int j = i + 1; j < nums.size(); j++) { if (target == (nums[i] + nums[j])) { ret.push_back(i); ret.push_back(j); } }*/ if (m.find(target - nums[i]) != m.end()) { return{ m[target - nums[i]], i }; } m[nums[i]] = i; } return{ 0, 0 }; } /* 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 */ int CLeetCode_Solution::reverse(int x) { int ret(0); while (x != 0) { int pop = x % 10; x /= 10; if (ret > INT_MAX / 10 || (ret == INT_MAX / 10 && pop > 7)) return 0; if (ret < INT_MIN / 10 || (ret == INT_MIN / 10 && pop - 8)) return 0; ret = ret * 10 + pop; } return ret; } /* *判断回文数 **/ bool CLeetCode_Solution::isPalindrome(int x) { if (x < 0) { return false; } long long rst(0); int x_tmp = x; while (x != 0) { int pop = x % 10; rst = rst * 10 + pop; x /= 10; } return (rst == x_tmp); } //二进制相加 std::string CLeetCode_Solution::addBinary(string a, string b) { int al = a.size(); int bl = b.size(); while (al < bl) { a = ‘0‘ + a; ++al; } while (bl < al) { b = ‘0‘ + b; ++bl; } for (int j = a.size() - 1; j > 0; j--) { a[j] = a[j] - ‘0‘ + b[j]; if (a[j] >= ‘2‘) { a[j] = (a[j] - ‘0‘) % 2 + ‘0‘; a[j - 1] = a[j - 1] + 1; } } a[0] = a[0] - ‘0‘ + b[0]; //将ab的第0位相加 if (a[0] >= ‘2‘) //若大于等于2,需要进一 { a[0] = (a[0] - ‘0‘) % 2 + ‘0‘; a = ‘1‘ + a; } return a; }
//罗马数字转阿拉伯数字 int CLeetCode_Solution::romanToInt(string s) { //顺序计算 /* unordered_map<string, int> m; m = { { "I", 1 },{ "IV", 3 },{ "IX", 8 },{ "V", 5 },{ "X", 10 },{ "XL", 30 },{ "XC", 80 },{ "L", 50 },{ "C", 100 },{ "CD", 300 },{ "CM", 800 },{ "D", 500 },{ "M", 1000 } }; int ret = m[s.substr(0, 1)]; for (int i = 1; i < s.size(); i++) { string two = s.substr(i - 1, 2); string one = s.substr(i, 1); ret += m[two] ? m[two] : m[one]; } return ret; */ //倒序计算(速度和内存更佳),从后面往前面取值,每次取一个符号,如果j的值比j+1大时,则ret减去j的值(罗马计算的规则) /* *输入: "LVIII" 输出: 58 解释: L = 50, V= 5, III = 3.*/ unordered_map<char, int> m; m = { { ‘I‘, 1 },{ ‘V‘, 5 },{ ‘X‘, 10 },{ ‘L‘, 50 },{ ‘C‘, 100 },{ ‘D‘, 500 },{ ‘M‘, 1000 } }; int ret = m[s[s.size() - 1]]; for (int j = s.size() - 2; j >= 0; j--) { int numL = m[s[j]]; int numR = m[s[j + 1]]; if (numL >= numR) ret += numL; else ret -= numL; } return ret; }
//字符串数组中的最长公共前缀 std::string CLeetCode_Solution::longestCommonPrefix(vector<string>& strs) { if (0 == strs.size()) return ""; string strfirst = strs[0]; for (int i = 1; i < strs.size(); i++) { int j = 0; for (; j < strfirst.size() && j < strs[i].size(); j++) { if (strfirst[j] != strs[i][j]) break; } strfirst = strfirst.substr(0, j); if (strfirst.empty()) return ""; } return strfirst; }
//判断是否有效的括号 bool CLeetCode_Solution::isValid(string s) { //()[]{} if (s.empty()) return true; if (0 != s.size() % 2) return false; unordered_map<char, char> m = { {‘(‘,‘)‘},{ ‘[‘,‘]‘ },{ ‘{‘,‘}‘ } }; stack<char> ret; for (int i = 0; i < s.size(); i++) { if (m.find(s[i])!=m.end()) ret.push(m[s[i]]); else if (ret.empty() || ret.top() != s[i]) return false; else ret.pop(); } if (ret.empty()) return true; else return false; }
//合并两个有序链表 ListNode* CLeetCode_Solution::mergeTwoLists(ListNode* l1, ListNode* l2) { if (l1 == NULL) return l2; if (l2 == NULL) return l1; if (l1->val <= l2->val) { l1->next = mergeTwoLists(l1->next, l2); return l1; } l2->next = mergeTwoLists(l1, l2->next); return l2; }
//删除排序数组中的重复项 int CLeetCode_Solution::removeDuplicates(vector<int>& nums) { /* if (nums.empty()) return 0; int i = 0; for (int j = 1; j < nums.size();++j) { if (nums[j] != nums[i]) { ++i; nums[i] = nums[j]; } } return i + 1;*/ if (nums.empty()) return 0; int val0 = nums[0]; for (vector<int>::iterator iter = nums.begin()+1; iter != nums.end();) { if (val0 == *iter) { iter = nums.erase(iter); } else { val0 = *iter; iter++; } } return nums.size(); } //给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。 int CLeetCode_Solution::removeElement(vector<int>& nums, int val) { int len = nums.size(); int pos = 0; while (pos < len) { if (nums[pos] == val) nums[pos] = nums[--len]; else ++pos; } nums.resize(len); return len; }
//手写strstr int CLeetCode_Solution::strStr(string haystack, string needle) { int n = haystack.size(), m = needle.size(); //减少循环,避免越界 for (int i = 0; i < n-m+1; ++i) { int j = 0; for (;j < m; ++j) {
//保证ha一起向前推进 if (haystack[i + j] != needle[j]) break; } if (j == m) return i; } return -1; }
以上是关于LeetCode--算法,简单级别1的主要内容,如果未能解决你的问题,请参考以下文章
算法入门 01线性枚举(简单 - 第二题)LeetCode 557
LeetCode算法题-N-ary Tree Level Order Traversal(Java实现)