2024年2月5日力扣题目训练
2024年2月5日第十二天编程训练,今天主要是进行一些题训练,包括简单题3道、中等题2道和困难题1道。惰性太强现在才完成,不过之后我会认真完成的。
476. 数字的补数
链接: 数字的补数
难度: 简单
题目:
运行示例:
思路:
由题目可知,我们可以将 num二进制表示的每一位取反。因此我们需要首先找到 num二进制表示最高位的那个 1,再将这个 1以及更低的位进行取反。
如果 num 二进制表示最高位的 1 是第 i (0≤i≤30)位,那么一定有:2i≤num<2i+1
因此我们可以使用一次遍历,在 [0,30]中找出 i的值。在这之后,我们就可以遍历 num的第 0∼i个二进制位,将它们依次进行取反。
代码:
class Solution {
public:
int findComplement(int num) {
int highbit = 0;
for(int i = 1; i < 31; i++){
if(num >= (1 << i)){
highbit = i;
}else{
break;
}
}
int mask = (highbit == 30 ? 0x7fffffff : (1 << (highbit + 1)) - 1);
return num ^ mask;
}
};
482. 密钥格式化
链接: 密钥格式化
难度: 简单
题目:
运行示例:
思路:
这道题本质就是对原来字符串进行分组,将’ - '分配到每组,主要是遍历。
代码:
class Solution {
public:
string licenseKeyFormatting(string s, int k) {
string res,ans;
for(int i = 0; i < s.size(); i++){
if(s[i] != '-'){
if(s[i] >= 'a' && s[i] <= 'z'){
res += s[i]-'a'+'A';
}else{
res+= s[i];
}
}
}
int count = 0;
for(int i = res.size()-1; i >= 0; i--){
if(count % k == 0 && count != 0){
ans+='-';
}
ans+=res[i];
count++;
}
reverse(ans.begin(),ans.end());
return ans;
}
};
485. 最大连续 1 的个数
链接: 连续 1 的个数
难度: 简单
题目:
运行示例:
思路:
这道题是一道比较简单问题,只需遍历一次记录连续1的个数即可。
代码:
class Solution {
public:
int findMaxConsecutiveOnes(vector<int>& nums) {
vector<int> dp(nums.size()+1,0);
int ans = 0;
for(int i = 1 ; i <= nums.size(); i++){
if(nums[i-1] == 1){
dp[i] = dp[i-1] + 1;
ans = (ans > dp[i])? ans:dp[i];
}else{
dp[i] = 0;
}
}
return ans;
}
};
148. 排序链表
链接: 排序链表
难度: 中等
题目:
运行示例:
思路:
这道题其实跟147. 对链表进行插入排序类似,我采用了相同方法解决,但很容易超时,所以官方的方法是归并排序完成。
代码:
class Solution {
public:
ListNode* sortList(ListNode* head) {
if(head == NULL) return head;
ListNode* newhead = new ListNode(0);
newhead->next = head;
ListNode* p = head;
ListNode* curr = head->next;
while(curr != NULL){
if(p->val <= curr->val){
p = p->next;
}else{
ListNode* pre = newhead;
while(pre->next->val <= curr->val) pre = pre->next;
p->next = curr->next;
curr->next = pre->next;
pre->next = curr;
}
curr = p->next;
}
return newhead->next;
}
};
164. 最大间距
链接: 最大间距
难度: 中等
题目:
运行示例:
思路:
这道题就是利用自带的排序函数,之后算差值,不过官方的方法是基数排序,没有利用自带的函数。
代码:
class Solution {
public:
int maximumGap(vector<int>& nums) {
if(nums.size() < 2) return 0;
sort(nums.begin(),nums.end());
vector<int> res(nums.size());
int count = 0;
for(int i = 1; i < nums.size(); i++){
count = (nums[i]-nums[i-1]) > count ?(nums[i]-nums[i-1]):count;
}
return count;
}
};
运行示例:
运行示例
思路:
这道题我知道是找一根柱子的左侧且最近的小于其高度的柱子,但我不太懂如何利用栈完成这道题。
官方解法
代码:
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int n = heights.size();
if(n == 0) return 0;
vector<int> left(n),right(n);
stack<int> st;
for(int i = 0; i < n; i++){
while(!st.empty() && heights[st.top()] >= heights[i]){
st.pop();
}
left[i] = (st.empty()? -1:st.top());
st.push(i);
}
st = stack<int>();
for(int i = n -1; i >= 0; i--){
while(!st.empty() && heights[st.top()] >= heights[i]){
st.pop();
}
right[i] = (st.empty()? n:st.top());
st.push(i);
}
int ans = 0;
for (int i = 0; i < n; ++i) {
ans = max(ans, (right[i] - left[i] - 1) * heights[i]);
}
return ans;
}
};