验证回文串(简单)
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
解题:
根据题目需求首先过滤掉非字母和数字的字符,紧接着通过双指针首尾遍历字符串,判断是否回文即可。
只需五行代码即可。
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 操作,并能在常数时间内检索到最小元素的栈。
解题:
这道题还比较有意思,需要我们设计一个最小栈,能够满足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。
说明:
解题:
由于题目当中说明给出的数组为有序数组,且数组当中无相同元素。那么我们可以利用到这一点,采用收尾双指针的方式,来找到对应的元素组合。
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;
}
};