Leetcode笔记189-203中的简单题

easy

189 旋转数组

题目:给定一个数组,将数组中的元素向右移动k个位置,其中k是非负数。
示例:
在这里插入图片描述
思路:
1.一个个数据进行移位交换。
2.新创建一个数组。长度和给定的数组相同;将原数组中每个元素都放到新的数组中正确的位置,也就是将原数组中第i个元素放到第i+k个位置;最后把新数组覆盖原数组。

代码:

//方法一:暴力破解
class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int temp,previous;
        for(int i=0;i<k;i++){
            previous=nums[nums.size()-1];
            for(int j=0;j<nums.size();j++){
                temp=nums[j];
                nums[j]=previous;
                previous=temp;
            }
        }
      
    }
};

//方法二
class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int a[nums.size()]={};
        for(int i=0;i<nums.size();i++){
            a[(i+k)%nums.size()]=nums[i];
        }
        for(int i=0;i<nums.size();i++){
            nums[i]=a[i];
        }
    }
};

190 颠倒二进制位

题目:颠倒给定的32位无符号整数的二进制位。
示例:
在这里插入图片描述
思路
利用位运算,将结果answer左移一位,空出了最后一位与n最后一位相加,再把answer左移一位,n右移一位;重复循环32次得到结果。

代码

class Solution {
public:
    uint32_t reverseBits(uint32_t n) {
        uint32_t answer=0;
        int i=32;
        while(i--){
            answer=answer<<1;
            answer=answer+(n&1);
            n=n>>1;
        }
        return answer;
    }
};

191 位1的个数

题目
编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。
示例:
在这里插入图片描述
思路
直接调用betset.count就能计算出来;
右移数组,利用与操作累计出1的个数。

代码

class Solution {
public:
    int hammingWeight(uint32_t n) {
        int answer=0;
        while(n){
            answer+=n&1;
            n>>1;
        }
        return answer;
    }
};

//更简单的:
class Solution {
public:
    int hammingWeight(uint32_t n) {
        bitset<32> b(n);
        return b.count();
    }
};

193 旋转数组

题目
给定一个包含电话号码列表(一行一个电话号码)的文本文件 file.txt,写一个 bash 脚本输出所有有效的电话号码。

你可以假设一个有效的电话号码必须满足以下两种格式: (xxx) xxx-xxxx 或 xxx-xxx-xxxx。(x 表示一个数字)

你也可以假设每行前后没有多余的空格字符。

思路
这一题考的是bash脚本,过滤电话号码的方法是用正则表达式,可以用grep -P或者awk来实现。具体实现方式也多种多样,这里的答案仅供参考。

代码

grep -P "^(\d{3}-|\(\d{3}\) )\d{3}-\d{4}$" file.txt 

\d{3}代表连续匹配三个数字,|是选择,^是开始的标志,$是结束的标志

195 第十行

题目:
给定一个文本文件 file.txt,请只打印这个文件中的第十行。

思路
这题可以考虑用sed,awk

代码

sed -n 10p file.txt
awk NR==10 file.txt

NR代表程序所读的行数

196 删除重复的电子邮箱

题目
编写一个 SQL 查询,来删除 Person 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。

思路
利用自连接,将子表中大于主表中的字段都删除;或者直接用子查询先找到最小的各项id,再把不在这个id中的字段删除。

代码

delete P1 
from person P1,person P2
where P1.email=P2.email and P1.id>p2.id
delete from person
where id not in
(
    select id from
    (
        select MIN(id)  as id 
        from person
        group by email
    )
    as temp
)

197 上升的温度

题目
给定一个 Weather 表,编写一个 SQL 查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 Id。
在这里插入图片描述
思路
可以用内连接,利用DATEDIFF确定上一条目录。
代码

select weather.Id as ID from weather
join weather w on datediff(weather.RecordDate,w.RecordDate)=1
and weather.temperature>w.temperature

198 打家劫舍

题目
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。
在这里插入图片描述思路
这一题是典型的动态规划问题。假设第一次偷的是第一户,保存在maxval[0];第二次偷的时候就可以比较第一户和第二户的大小,将较大的结果保存在maxval[1];第三次偷的时候再把第三户+maxvasl[0]的金额和maxval[1]比较,选其中更大的。利用for循环遍历这个过程可以得到maxval[n-1]就是我们想要的结果。

代码

class Solution {
public:
    int rob(vector<int>& nums) {
        int n = nums.size();
        if(n==0)
            return 0;
        else if(n==1)
            return nums[0];
        int maxval[n];
        maxval[0] = nums[0];
        maxval[1] = nums[0] > nums[1] ? nums[0] : nums[1];
        for(int i=2;i<n;i++){
            int option1 = nums[i] + maxval[i-2];
            int option2 = maxval[i-1];
            maxval[i] = option1 > option2 ? option1 : option2;
        }
        return maxval[n-1];
    }
};

202 快乐数

题目
编写一个算法来判断一个数是不是“快乐数”。

一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。
在这里插入图片描述

思路
1.所有不快乐的数都会进入4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4 的循环中。先给定一个集合初值为1,只要利用一个循环将每次各位数字的平方和添加进这个集合中,同时判断中断循环的条件是数字是否在这个集合中。如果是1就是快乐数。
2.可以用快慢跑的思想,一个每次求和两次,一个求和一次;如果最后两个值相遇,看是否等于1来判断是否是快乐数。

代码

class Solution {
public:
    int SquareNum(int n){
        int sum = 0;
        while(n>0){
            int temp = n % 10;
            sum += temp * temp;
            n = n / 10;
        }
        return sum;
    }
    
    bool isHappy(int n) {
        int slow = n;
        int fast = SquareNum(n);
        while(slow!=fast){
            slow = SquareNum(slow);
            fast = SquareNum(fast);
            fast = SquareNum(fast);
        }
        return slow == 1;
    }
};

203 移除链表元素

题目
删除链表中等于给定值 val 的所有节点。
在这里插入图片描述

思虑
简单题,遍历单链表,多余元素删除。

代码

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        if(!head)
            return head;
        while(head && head->val == val)
            head = head->next;
        
        ListNode* temp = head;
        while(temp && temp -> next){
            if(temp->next->val == val){
                temp->next = temp->next->next;
            }else{
                temp = temp -> next;
            }
        }
        return head;
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值