IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Leetcode 每日一题双题版(2.25+2.24)模拟练细节 -> 正文阅读

[数据结构与算法]Leetcode 每日一题双题版(2.25+2.24)模拟练细节

Leetcode 每日一题双题版(2.25+2.24)模拟练细节

前言

刚刚敲了今天刷新的题目,然后昨天的也写了,就想着更新一下blog

两道题都是模拟题,对于模拟,我的看法就是看懂题目,拿捏细节,难度就不大了。

2.24 球会落在何处

题目链接:1706. 球会落何处 - 力扣(LeetCode) (leetcode-cn.com)

简述,就是给你一个二维数组,只有1 和 -1,1表示左上角到右下角的斜线,-1是反过来,这些斜线就是挡板,问你从最上面小球落下,看能否到达底部,能填1,不能-1。

我在leetcode的题解:模拟 - 球会落何处 - 力扣(LeetCode) (leetcode-cn.com)

思路

这不就是一道小破模拟嘛,想清楚只有碰到V字或者在下降时越过边界才会不能到达底部。

那么问题就转化成什么时候V,同一行如果出现连续两个值不相同,那么是不是一定会V

code(C++)

#include<iostream>
#include<vector>

using namespace std;

class Solution 
{
public:
    /// <summary>
    /// 模拟 有手就行系列
    /// 先从列开始,然后遍历行,列的位置不断更新,如果出现越过边界时或者V字形则算不能落在底部
    /// 咋算V?
    /// 同一行变化前前和变化后的数值必须相同
    /// so,have hand just ok!
    /// </summary>
    /// <param name="grid"></param>
    /// <returns></returns>
    vector<int> findBall(vector<vector<int>>& grid) 
    {
        int m = grid.size(), n = grid[0].size();
        vector<int> ans(n);
        for (int i = 0; i < n; ++i)
        {
            // 球的初始列
            int col = i;
            for (auto& row : grid)
            {
                int num = row[col];
                col += row[col];
                // 越过边界或者出现V字形
                if (col < 0 || col >= n || row[col] != num)
                {
                    col = -1;
                    break;
                }
            }
            ans[i] = col;
        }
        return ans;
    }
};

int main(int argc, char** argv)
{
    int m, n;
    cin >> m >> n;
    vector<vector<int>> grid(m, vector<int>(n));
    for (int i = 0; i < m; ++i)
    {
        for (int j = 0; j < n; ++j)
        {
            cin >> grid[i][j];
        }
    }
    Solution sol;
    auto ans = sol.findBall(grid);
    for (int i = 0; i < n; ++i)
    {
        cout << ans[i] << " ";
    }
    cout << endl;

	return 0;
}

2.25 复数乘法

题目链接:537. 复数乘法 - 力扣(LeetCode) (leetcode-cn.com)

简述,就是给你两个字符串复数,然后算出他们的乘积,返回乘积的字符串形式就行了。

我的题解:简单模拟 - 复数乘法 - 力扣(LeetCode) (leetcode-cn.com)

思路

读完题目,很直接啊。先从字符串中取出系数,然后计算出答案的系数最后返回成字符串形式就好了。

这里对系数转字符串,我使用了C++的sstream库的字符串流对象stingstream,这里在多次使用的时候有个小细节,我们需要清空流对象的缓冲区,使用clear()函数可以解决,其实稳妥来写还应该加一句.str("")置空。

code(C++)

#include<iostream>
#include<string>
#include<sstream>
using namespace std;

class Solution 
{
public:
    /// <summary>
    /// 简答模拟
    /// 先从字符串中得出系数,需要注意负号
    /// 然后根据四个系数计算出答案的系数
    /// 将答案转成字符串拼接即可
    /// </summary>
    /// <param name="num1">复数1</param>
    /// <param name="num2">复数2</param>
    /// <returns>答案复数</returns>
    string complexNumberMultiply(string num1, string num2) 
    {
        // 长长整形系数,我不相信会有超过这个长度的系数!如果超过则需要写一个大数乘法函数
        long long a1 = 0, b1 = 0, a2 = 0, b2 = 0;
        StringToNum(a1, b1, num1);
        StringToNum(a2, b2, num2);
        // 计算答案系数
        long long a = a1 * a2 - b1 * b2;
        long long b = a1 * b2 + a2 * b1;
        // 字符串流,用于将数字转字符串
        stringstream ss;
        string str, ans;
        ss << a;
        ss >> str;
        // 细节,将字符串流清空
        ss.clear();
        ans = str + "+";
        ss << b;
        ss >> str;
        ss.clear();
        ans += str + "i";
        return ans;
    }
private:
    /// <summary>
    /// 从字符串数字中取出系数
    /// </summary>
    /// <param name="a"></param>
    /// <param name="b"></param>
    /// <param name="num"></param>
    void StringToNum(long long& a, long long& b, string num)
    {
        // 记录是否有负号
        bool f1 = false, f2 = f1;
        // 记录加号
        bool flag = false;
        for (int i = 0; i < num.size() - 1; ++i)
        {
            char ch = num[i];
            if (ch == '-' && i == 0)
            {
                f1 = true;
            }
            else if (ch == '-' && i != 0)
            {
                f2 = true;
            }
            else if (ch == '+')
            {
                flag = true;
            }
            else if (!flag)
            {
                a = a * 10 + (int)(ch - '0');
            }
            else
            {
                b = b * 10 + (int)(ch - '0');
            }
        }
        if (f1)
        {
            a = -a;
        }
        if (f2)
        {
            b = -b;
        }
    }
};

int main(int argc, char** argv)
{
    string num1, num2;
    cin >> num1 >> num2;
    Solution sol;
    cout << sol.complexNumberMultiply(num1, num2) << endl;

	return 0;
}

后话

最近打了codeforces和牛客的比赛,双双折戟了,可能是太久没有刷算法,退化了,以后还是保持下去。

共勉,uu们。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 11:55:08  更:2022-02-26 11:59:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 16:57:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码