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的主要内容,如果未能解决你的问题,请参考以下文章

Hard 级别难度?桶排序几行代码搞定!

LeetCode上最热门的题目(easy级别)

算法入门 01线性枚举(简单 - 第二题)LeetCode 557

LeetCode算法题-N-ary Tree Level Order Traversal(Java实现)

⭐算法入门⭐《二叉树》简单03 —— LeetCode 101. 对称二叉树

算法专题(01)二分查找(01) 简单LeetCode 704