力扣日常练习

验证回文串(简单)

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

说明:本题中,我们将空字符串定义为有效的回文串。

解题:

根据题目需求首先过滤掉非字母和数字的字符,紧接着通过双指针首尾遍历字符串,判断是否回文即可。

  • isalnum()函数表示判断字符是否为字母和数字
  • tolower()函数表示将字符转换为小写格式

只需五行代码即可。

class Solution {
public:
    bool isPalindrome(string s) {
        string str = "";
        for(auto c: s) if(isalnum(c)) str += tolower(c);
        for(int i=0, m=str.size(); i

只出现一次的数字(简单)

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

解题:

简单的异或运算,由于两个相同的数异或的结果为0,而0与一个数异或为该数本身,那么根据数组本身的特点,便有以下解决思路:

class Solution {
public:
    int singleNumber(vector& nums) {
        int result = 0;
        for (auto i : nums)
            result = result ^ i;
        return result;
    }
};

最小栈(简单)

设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。

  • push(x) -- 将元素 x 推入栈中。
  • pop() -- 删除栈顶的元素。
  • top() -- 获取栈顶元素。
  • getMin() -- 检索栈中的最小元素。

解题:

这道题还比较有意思,需要我们设计一个最小栈,能够满足O(1)时间复杂度返回栈中最小元素。因此我们采用辅助栈的方法,来帮助我们获取数据栈中的最小元素,需要注意的事情有以下几点:

  • 辅助栈为空的时候,必须放入新进来的数;
  • 新来的数小于或者等于辅助栈栈顶元素的时候,才放入,特别注意这里“等于”要考虑进去,因为出栈的时候,连续的、相等的并且是最小值的元素要同步出栈
  • 出栈的时候,辅助栈的栈顶元素等于数据栈的栈顶元素,才出栈。

总结来说:出栈时,最小值出栈才同步;入栈时,最小值入栈才同步

下面给出具体代码实现:

class MinStack {
public:
    stack s;//数据栈
    stack min;//辅助栈
    /** initialize your data structure here. */
    MinStack() {
        
    }
    
    void push(int x) {
        s.push(x);
        if(min.empty()||x<=min.top()) {
            min.push(x);
        }
    }
    
    void pop() {
        if(s.top()==min.top())
            min.pop();
        s.pop();
    }
    
    int top() {
        return s.top();
    }
    int getMin() {
        return min.top();
    }
};

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack* obj = new MinStack();
 * obj->push(x);
 * obj->pop();
 * int param_3 = obj->top();
 * int param_4 = obj->getMin();
 */

两数之和2-输入有序数组(简单)

给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。

函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。

说明:

  • 返回的下标值(index1 和 index2)不是从零开始的。
  • 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。

解题:

由于题目当中说明给出的数组为有序数组,且数组当中无相同元素。那么我们可以利用到这一点,采用收尾双指针的方式,来找到对应的元素组合。

class Solution {
public:
    vector twoSum(vector& numbers, int target) {
        if (numbers.empty()) return {};
        int left = 0;
        int right = numbers.size()- 1;
        while(left < right)
        {
            if(numbers[left] + numbers[right] > target)
                --right;
            else if(numbers[left] + numbers[right] < target)
                ++left;
            else {
                return {left + 1, right + 1};
            }
        }
        return {};
    }
};

Excel表列名称(简单)

给定一个正整数,返回它在 Excel 表中相对应的列名称。

例如:

1 A
2 B
3 C
... ...
26 Z
27 AA
28 AB
... ...

解题:

其实这道题本质是将十进制数转化为26进制数,需要我们注意的是,此时的A-Z对应的不是0-25,而是1-26,因此在处理边界条件的时候需要注意一下:

class Solution {
public:
    string convertToTitle(int n) {
        string ans = "";
        while(n > 0) {
            int flag = n % 26;
            if (flag == 0) {
                flag = 26;
            }
            ans = char('A' + flag -1) + ans;
            n = (n - flag) / 26;
        }
        return ans;
    }
};

阶乘后的零(简单)

给定一个整数 n,返回 n! 结果尾数中零的数量。(时间复杂度O(logn))

解题:

即返回阶乘因子当中包含5的个数(这道题记住就好了):

class Solution {
public:
    int trailingZeroes(int n) {
        int count = 0;
        while (n > 0) {
            count += n / 5;
            n = n / 5;
        }
        return count;
    }
};

 

 

你可能感兴趣的:(随便写写)