草庐IT

wwm.LeetCodeHelper C#刷题帮助类库

wwmin 2023-03-28 原文

wwm.LeetCodeHelper



仓库地址:https://gitee.com/wwmin/wwm.leetcode.helper

1. 说明

wwm.LeetCodeHelper是一款帮助在本地用C#做LeetCode题的一个库,具有自动拉取题生成csharp文件,自动生成测试用例,自动完成测试对比等等的功能。

  • 适用语言范围:C#
  • 使用LeetCode版本:国内版

2. 安装

dotnet add package wwm.LeetCodeHelper --version 0.8.6
Install-Package wwm.LeetCodeHelper -Version 0.8.6

3. 使用方式:

创建控制台应用程序
只需要创建一次此控制台应用程序,后面的题库内容都是一个一个类文件
在program.cs文件中添加如下内容

//方式一: 方便自定义刷题
using Microsoft.Extensions.Configuration;
#region 初始化
//添加secrets.json 然后从中读取登录信息
//方法一:
//步骤1: 添加依赖 Microsoft.Extensions.Configuration
//步骤2: 右键项目然后选择管理用户机密,然后在打开的secrets.json中添加
/*
{
"user_password_login": {
    "email": "your email",
    "password": "your password"
  },
  "cookie_login": {
    "LEETCODE_SESSION": "your leetcode_session cookie",
  }
}
*/
// 注意如果项用cookie登录则填充"cookie_login",如果使用用户名密码登录则填充"user_password_login",建议使用cookie,用户名密码模式需要用到模拟登录,且需要下载无头浏览器,配置起来稍微麻烦一些。
//方法二:
//步骤1: 添加依赖 Microsoft.Extensions.Configuration
//步骤2: 启用机密,使用.net cli命令 `dotnet user-secrets init`
//步骤3: 设置机密, `dotnet user-secrets set "cookie_login:LEETCODE_SESSION" "your cookie"`
//        或者设置用户名密码 `dotnet user-secrets set "user_password_login:email" "your email"` `dotnet user-secrets set "user_password_login:password" "your password"`
//步骤4: 查看 `dotnet user-secrets list`
// 更多dotnet cli 可参考:https://docs.microsoft.com/zh-cn/aspnet/core/security/app-secrets?view=aspnetcore-6.0&tabs=windows

var config = new ConfigurationBuilder()
    .SetBasePath(AppDomain.CurrentDomain.BaseDirectory)
    .AddUserSecrets<Program>().Build();
var config_cookie = config.GetRequiredSection("cookie_login:LEETCODE_SESSION").Value;
if (config_cookie != null)
{
    await LeetCodeHelper.InitAsync(config_cookie);
}
else
{
    var config_email = config.GetRequiredSection("user_password_login:email")?.Value;
    var config_password = config.GetRequiredSection("user_password_login:password")?.Value;
    if (string.IsNullOrEmpty(config_email) || string.IsNullOrEmpty(config_password))
    {
        throw new Exception("cookie或者email/password 其中之一是必须的,建议使用cookie");
    }
    await LeetCodeHelper.InitAsync(config_email, config_password);
}
#endregion
#if !Release  //切换此处的开关可在自定义刷题和每日一题之间切换
string url = "";
if (string.IsNullOrEmpty(url))
{
    TestResultHelper.InvokeAllTest();
}
else
{
    await LeetCodeHelper.GetQuestionAsync(url);
}
#else
//方式二: 方便刷每日一题
await LeetCodeHelper.GetTodayQuestionOrInvokeTestAsync();
#endif
Console.Write("按任意键退出...");
Console.ReadKey();

4. 初始化用户信息

为了安全起见,建议用户将自己的cookie LEETCODE_SESSION值存储到secrets.json文件中,这样将自己的代码库上传到git远程仓库就不会担心自己的leet-code信息被盗取了

具体说明:参考上段代码中的注释部分

如何获取LEETCODE_SESSION?

获取leetcode网站cookie方法:
登录leetcode网站后,打开控制台,找到控制台的Application面板在左侧的Storage项中找到Cookies然后选中https://leetcode.cn
右侧有出现该网站的cookie目录,寻找到LEETCODE_SESSION选中后,复制后面的Value值即可。

5. 刷题方式:1.自定义url 2.每日一题

5.1 自定义url

只需要将 #if !Release中Release前加个!即可,这样在Debug模式下系统就执行此处的代码

5.2 每日一题模式

与方式1相反,去掉Release前的!,在Debug模式下系统就执行此处的代码

当然这里的方式1和2的组织模式可以自由发挥。

6. 获取题目

在选择自定义url模式刷题时,获取题目需要添加url内容

string url = "https://leetcode.cn/problems/two-sum/"

然后F5运行,
控制台中内容如下:

已从接口获取数据
将数据写入文件:two-sum.txt
文件已写入:D:\work\learn\dotnet\wwm.LeetCodeHelper\wwm.LeetCodeHelper.Test\Content\two-sum.txt
文件名已拷贝到剪贴板: two-sum.txt
文件已写入:D:\work\learn\dotnet\wwm.LeetCodeHelper\wwm.LeetCodeHelper.Test\Solutions\two-sum.cs
文件名已拷贝到剪贴板: two-sum.cs
按任意键退出...

文件名已经复制到了剪贴板中,在Visual Studio中按Ctrl+Shift+T快捷键弹出框中,粘贴文件名后查找到回车即可,此处为了节省文件变多后查找刚下载的文件的时间

内容如下:

namespace Solutions;
/// <summary>
/// 1556. 通过翻转子数组使两个数组相等
/// </summary>
public class CanBeEqualSolution : ITest
{
    private class Data : DataAttribute
    {
        public override IEnumerable<object[]> GetData()
        {
            yield return new object[] { StringTo<int[]>("[1,2,3,4]").ToArray(), StringTo<int[]>("[2,4,1,3]").ToArray(), true };
            yield return new object[] { StringTo<int[]>("[7]").ToArray(), StringTo<int[]>("[7]").ToArray(), true };
            yield return new object[] { StringTo<int[]>("[3,7,9]").ToArray(), StringTo<int[]>("[3,7,11]").ToArray(), false };
        }
    }

    [Data]
    public bool CanBeEqual(int[] target, int[] arr)
    {
        return default;
    }
}

会在题内容上面加上测试用例,
如果是自定义刷题模式时,将url置空后就会进入执行实现ITest接口的类,
如果是每日刷题,会自动判断题目是否已经下载,如果已下载则进入执行实现ITest的接口类。

7. 运行测试

编写你的算法代码

using wwm.LeetCodeHelper.Servers;

namespace Solutions;
/// <summary>
/// 1. 两数之和
/// https://leetcode.cn/problems/two-sum/
/// </summary>
public class TwoSumSolution : ITest
{
    private class Data : DataAttribute
    {
        public Data()
        {
            IgnoreOrder = true;
        }

        public override IEnumerable<object[]> GetData()
        {
            yield return new object[] { StringTo<int[]>("[2,7,11,15]").ToArray(), 9, StringTo<int[]>("[0,1]").ToArray() };
            yield return new object[] { StringTo<int[]>("[3,2,4]").ToArray(), 6, StringTo<int[]>("[1,2]").ToArray() };
            yield return new object[] { StringTo<int[]>("[3,3]").ToArray(), 6, StringTo<int[]>("[0,1]").ToArray() };
        }
    }

    [Data]
    public int[] TwoSum(int[] nums, int target)
    {
        int[] o = new int[2];
        int i, j, k = 0;
        for (i = 0; i < nums.Length; i++)
        {
            for (j = i + 1; j < nums.Length; j++)
            {
                if ((nums[i] + nums[j]) == target)
                {
                    o[0] = i;
                    o[1] = j;
                    k = 1;
                }
            }
            if (k == 1) break;

        }
        return o;
    }
}

F5执行,结果如下:

------->TwoSumSolution
TwoSum: 执行结果正确: [0,1]
TwoSum: 执行结果正确: [1,2]
TwoSum: 执行结果正确: [0,1]
_______测试结果: 3/3 ,耗时:97ms________

按任意键退出...

如果执行中有错误答案,会给出预期值和运行结果值,如下

------->TwoSumSolution
TwoSum: 执行结果正确: [0,1]
TwoSum: 执行结果错误.
  预期值:[1,2]
  结果值:[0,0]
TwoSum: 执行结果正确: [0,1]
_______测试结果: 2/3 ,耗时:82ms________

按任意键退出...

控制台中也会有颜色提示,正确的为绿色,错误的为红色。

当测试完成后,需要将类的继承接口ITest去掉,这样下次就不会测试该类了。

该库暂时仍在完善中,如遇到问题可提issue。

许可证 / License

wwm.LeetCodeHelper 采用 Apache License 2.0 开源许可证。

wwm.LeetCodeHelper uses the Apache License 2.0 open source license.

作者:wwmin
出处:https://www.cnblogs.com/cnwwm
联系:wwei.min@163.com 微信:w_wmin

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。如有问题或建议,请多多赐教,非常感谢。

有关wwm.LeetCodeHelper C#刷题帮助类库的更多相关文章

  1. ruby - 有人可以帮助解释类创建的 post_initialize 回调吗 (Sandi Metz) - 2

    我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法

  2. ruby-on-rails - Cucumber 是否只是 rspec 的包装器以帮助将测试组织成功能? - 2

    只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您

  3. ruby-on-rails - 需要帮助最大化多个相似对象中的 3 个因素并适当排序 - 2

    我需要用任何语言编写一个算法,根据3个因素对数组进行排序。我以度假村为例(如Hipmunk)。假设我想去度假。我想要最便宜的地方、最好的评论和最多的景点。但是,显然我找不到在所有3个中都排名第一的方法。Example(assumingthereare20importantattractions):ResortA:$150/night...98/100infavorablereviews...18of20attractionsResortB:$99/night...85/100infavorablereviews...12of20attractionsResortC:$120/night

  4. ruby - 帮助使用 Ruby 中的 "Whenever"gem 来执行 cron 任务 - 2

    我以前没有使用过cron,所以我不能确定我这样做是对的。我想要自动化的任务似乎没有运行。我在终端中执行了这些步骤:sudogeminstall每当切换到应用程序目录无论何时。(这创建了文件schedule.rb)我将此代码添加到schedule.rb:every10.minutesdorunner"User.vote",environment=>"development"endevery:hourdorunner"Digest.rss",:environment=>"development"end我将此代码添加到deploy.rb:after"deploy:symlink","depl

  5. ruby-on-rails - 从帮助器规范中 stub 一个帮助器方法 - 2

    我正在构建Rails应用程序并使用RSpec制定测试。我为我正在创建的名为current_link_to的方法编写了测试。此方法应该检查当前页面是否对应于我传递给它的路径,并将current类添加到生成的链接中,以防它匹配。这是规范:require"spec_helper"describeApplicationHelperdodescribe"#current_link_to"dolet(:name){"Products"}let(:path){products_path}let(:rendered){current_link_to(name,path)}context"whenthe

  6. ruby - 需要帮助改进 Ruby DSL 以控制 Arduino 控制的饮料分配器(bar monkey) - 2

    我正在用Ruby编写DSL来控制我正在处理的Arduino项目;巴尔迪诺。这是一只酒吧猴子,将由软件控制来提供饮料。Arduino通过串行端口接收命令,告诉Arduino要打开什么泵以及打开多长时间。它目前正在读取一个食谱(见下文)并将其打印出来。串行通信的代码以及我在下面提到的其他一些想法仍然需要改进。这是我的第一个DSL,我正在处理之前的示例,所以它的边缘非常粗糙。任何批评、代码改进(是否有任何关于RubyDSL最佳实践或习语的良好引用?)或任何一般性评论。我目前有DSL的粗略草稿,因此饮料配方如下所示(Githublink):desc"Simpleglassofwater"rec

  7. ruby - 帮助评估构建工具 - 2

    我已经熟悉并使用Ant&Maven,此时我想扩展到另一个工具,我在“Buildr”和“Gradle”之间做出决定。我非常感谢那些使用过其中一种或两种工具的人的见解/反馈,因为坦率地说,在这一点上,对我来说唯一真正的区别似乎是ruby​​与groovy(我对两者都感到满意并喜欢)。我也希望能回答以下问题:我知道Buildr允许下载和提取不在maven类型存储库中的依赖项,Gradle是否提供相同的功能?Buildr/Gradle能否用于构建其他语言的源代码——即groovy、ruby、actionscript/flex、c系列等?Buildr/Gradle与Hudson或Jenkins的

  8. ruby - 在使用 ruby​​ 中的 "mail"gem 阅读电子邮件时需要帮助 - 2

    我正在使用Watir进行自动化,它会创建一封我需要检查的电子邮件。有人指出电子邮件gem是执行此操作的最简单方法。我添加了以下代码,并且能够从我的收件箱中收到第一封电子邮件。require'mail'require'openssl'Mail.defaultsdoretriever_method:pop3,:address=>"email.someemail.com",:port=>995,:user_name=>'domain/username',:password=>'pwd',:enable_ssl=>trueendputsMail.first我是这个论坛的新手,有以下问题:如何获

  9. ruby-on-rails - Rails error resource_name - 设计帮助路由和渲染 - 2

    我正在尝试呈现Devisegem的登录View,但出现错误,下面是我目前拥有的代码:这是我的views/users/shared/_links.html.erb:还有我的config/routes.rb:Densidste::Application.routes.drawdomatch'user/edit'=>'users#edit',:as=>:edit_current_usermatch'signup'=>'devise/users#new',:as=>:signupmatch'logout'=>'devise/sessions#destroy',:as=>:logoutdevis

  10. ruby - MacVim 命令窗口文本着色帮助(Rspec 输出) - 2

    我正在尝试为ruby​​开发人员过渡到MacVim。我遇到的一个难题是快速运行规范并轻松获得结果(通过/失败)。当我运行:Rake(或:!rspec%)时,它会运行当前文件中的规范。输出显示在命令窗口中。如果我在常规终端中运行它,我会得到彩色输出。也就是说,点是绿色的,失败的是红色的。在MacVim中,我得到了这些奇怪的[32m和[0m标记。这是一个例子:关于如何解决这个问题有什么想法吗? 最佳答案 Gvim(我假设Macvim就是那个有品牌名称的:))背后没有真正的终端,所以这就是为什么你会得到这些“奇怪”的标记——它们是真正的转

随机推荐