Skip to content

Commit dbdb255

Browse files
committed
feat: add getQuestionCode
1 parent 3181712 commit dbdb255

File tree

8 files changed

+132
-8
lines changed

8 files changed

+132
-8
lines changed

common/question/getJSCode.js

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
2+
const { JSDOM } = require('jsdom')
3+
const { open } = require('../scripts/open.js');
4+
const fs = require('fs')
5+
const { getCodeDetailJson } = require('../resources/codeDetailJson')
6+
const { readStore } = require("../utils/store");
7+
8+
const todayQuestionInfo = readStore('today-question-info')
9+
const todayQuestionEnName = todayQuestionInfo.enName
10+
11+
const root = new JSDOM(`
12+
<!DOCTYPE html>
13+
<html lang="en">
14+
<head>
15+
<meta charset="UTF-8">
16+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
17+
<title>leetcode today question</title>
18+
</head>
19+
<body>
20+
<div id="app">
21+
<code id="code"></code>
22+
</div>
23+
</body>
24+
</html>`)
25+
26+
const window = root.window
27+
const document = window.document
28+
const code = document.querySelector('#code')
29+
30+
fetch("https://leetcode.cn/graphql/", getCodeDetailJson(todayQuestionEnName)).then((res => res.json())).then(res => {
31+
questionCodeDetail = res.data.question.envInfo;
32+
code.innerHTML = JSON.stringify(questionCodeDetail, null, 2)
33+
fs.writeFileSync('./index.html', root.serialize())
34+
open('./index.html')
35+
})
36+

common/resources/codeDetailJson.js

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
function getCodeDetailJson(todayQuestionEnName) {
2+
return {
3+
"headers": {
4+
"accept": "*/*",
5+
"accept-language": "zh-CN,zh;q=0.9",
6+
"authorization": "",
7+
"baggage": "sentry-environment=production,sentry-release=dc00d92c,sentry-transaction=%2Fproblems%2F%5Bslug%5D%2F%5B%5B...tab%5D%5D,sentry-public_key=1595090ae2f831f9e65978be5851f865,sentry-trace_id=63e64ebe4c004e44af12023093cf6c60,sentry-sample_rate=0.03",
8+
"content-type": "application/json",
9+
"random-uuid": "3ba3266f-8cdc-50f8-76a8-afb018b0800f",
10+
"sec-ch-ua": "\"Not_A Brand\";v=\"8\", \"Chromium\";v=\"120\", \"Google Chrome\";v=\"120\"",
11+
"sec-ch-ua-mobile": "?0",
12+
"sec-ch-ua-platform": "\"macOS\"",
13+
"sec-fetch-dest": "empty",
14+
"sec-fetch-mode": "cors",
15+
"sec-fetch-site": "same-origin",
16+
"sentry-trace": "63e64ebe4c004e44af12023093cf6c60-8b25a25047a9cf20-0",
17+
"x-csrftoken": "5l2cDzYgivVOeSfwaQMMqVmaUOqWZKKRxUOufphTy9P6WKE8tajZYD0P21Qr3IRF",
18+
"cookie": "_bl_uid=a1lz4p9q294cs4d74npj8UU4g8p1; gr_user_id=b3bd9d67-816b-478c-b4ee-f13e289fd1b8; a2873925c34ecbd2_gr_last_sent_cs1=smallteddy; _gid=GA1.2.2051268794.1704617261; Hm_lvt_f0faad39bcf8471e3ab3ef70125152c3=1704421023; csrftoken=5l2cDzYgivVOeSfwaQMMqVmaUOqWZKKRxUOufphTy9P6WKE8tajZYD0P21Qr3IRF; a2873925c34ecbd2_gr_session_id=a49cd939-b802-49ce-b7f1-3f01b7da1559; a2873925c34ecbd2_gr_last_sent_sid_with_cs1=a49cd939-b802-49ce-b7f1-3f01b7da1559; a2873925c34ecbd2_gr_session_id_sent_vst=a49cd939-b802-49ce-b7f1-3f01b7da1559; _gat=1; messages=.eJyLjlaKj88qzs-Lz00tLk5MT1XSMdAxMtVRiik1M0i0iCk1TUkziik1T01OA5Jm5klAEcO0RKVYHXI1xgIAbLEkzQ:1rOSzN:wbrvDPKyUsGz-hhztv_YmeXUNqBadmexKC0oKp6z0u4; _ga=GA1.1.42792980.1700208726; a2873925c34ecbd2_gr_cs1=smallteddy; Hm_lpvt_f0faad39bcf8471e3ab3ef70125152c3=1705109952; _ga_PDVPZYN3CW=GS1.1.1705105702.37.1.1705109963.45.0.0",
19+
"Referer": "https://leetcode.cn/problems/construct-string-with-repeat-limit/?envType=daily-question&envId=Invalid%20Date",
20+
"Referrer-Policy": "strict-origin-when-cross-origin"
21+
},
22+
"body": "{\"query\":\"\\n query questionEditorData($titleSlug: String!) {\\n question(titleSlug: $titleSlug) {\\n questionId\\n questionFrontendId\\n codeSnippets {\\n lang\\n langSlug\\n code\\n }\\n envInfo\\n enableRunCode\\n hasFrontendPreview\\n frontendPreviews\\n }\\n}\\n \",\"variables\":{\"titleSlug\":\"" + todayQuestionEnName + "\"},\"operationName\":\"questionEditorData\"}",
23+
"method": "POST"
24+
}
25+
}
26+
27+
module.exports = { getCodeDetailJson }

common/resources/store.json

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1 @@
1-
{
2-
"today": "2085"
3-
}
1+
{"today":"2182","today-question-info":{"id":"2182","enName":"construct-string-with-repeat-limit","title":"构造限制重复的字符串","detail":"<p>给你一个字符串 <code>s</code> 和一个整数 <code>repeatLimit</code> ,用 <code>s</code> 中的字符构造一个新字符串 <code>repeatLimitedString</code> ,使任何字母 <strong>连续</strong> 出现的次数都不超过 <code>repeatLimit</code> 次。你不必使用 <code>s</code> 中的全部字符。</p>\n\n<p>返回 <strong>字典序最大的</strong><em> </em><code>repeatLimitedString</code> 。</p>\n\n<p>如果在字符串 <code>a</code> 和 <code>b</code> 不同的第一个位置,字符串 <code>a</code> 中的字母在字母表中出现时间比字符串 <code>b</code> 对应的字母晚,则认为字符串 <code>a</code> 比字符串 <code>b</code> <strong>字典序更大</strong> 。如果字符串中前 <code>min(a.length, b.length)</code> 个字符都相同,那么较长的字符串字典序更大。</p>\n\n<p>&nbsp;</p>\n\n<p><strong>示例 1:</strong></p>\n\n<pre><strong>输入:</strong>s = \"cczazcc\", repeatLimit = 3\n<strong>输出:</strong>\"zzcccac\"\n<strong>解释:</strong>使用 s 中的所有字符来构造 repeatLimitedString \"zzcccac\"。\n字母 'a' 连续出现至多 1 次。\n字母 'c' 连续出现至多 3 次。\n字母 'z' 连续出现至多 2 次。\n因此,没有字母连续出现超过 repeatLimit 次,字符串是一个有效的 repeatLimitedString 。\n该字符串是字典序最大的 repeatLimitedString ,所以返回 \"zzcccac\" 。\n注意,尽管 \"zzcccca\" 字典序更大,但字母 'c' 连续出现超过 3 次,所以它不是一个有效的 repeatLimitedString 。\n</pre>\n\n<p><strong>示例 2:</strong></p>\n\n<pre><strong>输入:</strong>s = \"aababab\", repeatLimit = 2\n<strong>输出:</strong>\"bbabaa\"\n<strong>解释:</strong>\n使用 s 中的一些字符来构造 repeatLimitedString \"bbabaa\"。 \n字母 'a' 连续出现至多 2 次。 \n字母 'b' 连续出现至多 2 次。 \n因此,没有字母连续出现超过 repeatLimit 次,字符串是一个有效的 repeatLimitedString 。 \n该字符串是字典序最大的 repeatLimitedString ,所以返回 \"bbabaa\" 。 \n注意,尽管 \"bbabaaa\" 字典序更大,但字母 'a' 连续出现超过 2 次,所以它不是一个有效的 repeatLimitedString 。\n</pre>\n\n<p>&nbsp;</p>\n\n<p><strong>提示:</strong></p>\n\n<ul>\n\t<li><code>1 &lt;= repeatLimit &lt;= s.length &lt;= 10<sup>5</sup></code></li>\n\t<li><code>s</code> 由小写英文字母组成</li>\n</ul>\n"}}

common/scripts/createToday.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@
66
const { getQuestion } = require("../utils/getQuestion");
77
const { createQuestion } = require("../utils/createQuestion");
88
const { fulfillQuestion } = require("../utils/fulfillQuestion");
9-
const { writeStore } = require("../utils/store");
9+
const { readStore } = require("../utils/store");
1010
const args = process.argv.slice(2);
1111
// 获取问题的全部信息
1212
getQuestion().then(question => {
1313
console.log("[getQuestion]", question)
1414
const projectName = args[0] ?? question.id;// 传入 或者没传入 默认值为信息的编号
1515
// 缓存今日tag
16-
writeStore("today", projectName)
17-
createQuestion(projectName).then((filePath) => {
16+
const todayQuestionInfo = readStore("today-question-info")
17+
createQuestion(todayQuestionInfo.id).then((filePath) => {
1818
fulfillQuestion(filePath, question);
1919
})
2020
})

common/utils/getQuestion.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
11
const questionFetchConfig = require("../resources/question.json");
22
const qu = require("../resources/questionDetail.json")
3+
const { writeStore } = require("../utils/store");
34

45
async function getQuestion() {
56
const question = await fetch("https://leetcode.cn/graphql/", questionFetchConfig).then((res => res.json()));
67
// 标题的英文字符串
78
const slug = question.data.todayRecord[0].question.titleSlug;
89
qu.body = qu.body.replace("${slug}", slug);
910
const questionDetail = await fetch("https://leetcode.cn/graphql/", qu).then((res => res.json()));
10-
return {
11+
const questionInfo = {
1112
id: question.data.todayRecord[0].question.frontendQuestionId,
13+
enName: question.data.todayRecord[0].question.titleSlug,
1214
title: questionDetail.data.question.translatedTitle,
1315
detail: questionDetail.data.question.translatedContent
1416
}
17+
writeStore("today-question-info", questionInfo)
18+
return questionInfo
1519
}
1620

1721
module.exports = { getQuestion };

index.html

+11
Large diffs are not rendered by default.

package.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
1010
"preget-question": "rimraf index.html",
1111
"get-question": "node common/question/getQuestion.js",
1212
"create-today": "node common/scripts/createToday.js",
13-
"check-today": "node common/scripts/checkToday.js"
13+
"check-today": "node common/scripts/checkToday.js",
14+
"preget-question-code": "npm run create-today",
15+
"get-question-code": "node common/question/getJSCode.js"
1416
},
1517
"author": "EternalHeart",
1618
"license": "ISC",

src/2182/index.js

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
const { withTimeLog } = require("../../common/utils/withTimeLog");
2+
/**
3+
* 构造限制重复的字符串
4+
* 给你一个字符串 s 和一个整数 repeatLimit ,用 s 中的字符构造一个新字符串 repeatLimitedString ,使任何字母 连续 出现的次数都不超过 repeatLimit 次。你不必使用 s 中的全部字符。
5+
* 返回 字典序最大的 repeatLimitedString 。
6+
* 如果在字符串 a 和 b 不同的第一个位置,字符串 a 中的字母在字母表中出现时间比字符串 b 对应的字母晚,则认为字符串 a 比字符串 b 字典序更大 。如果字符串中前 min(a.length, b.length) 个字符都相同,那么较长的字符串字典序更大。
7+
*
8+
* 示例 1:
9+
* 输入:s = "cczazcc", repeatLimit = 3
10+
* 输出:"zzcccac"
11+
* 解释:使用 s 中的所有字符来构造 repeatLimitedString "zzcccac"。
12+
* 字母 'a' 连续出现至多 1 次。
13+
* 字母 'c' 连续出现至多 3 次。
14+
* 字母 'z' 连续出现至多 2 次。
15+
* 因此,没有字母连续出现超过 repeatLimit 次,字符串是一个有效的 repeatLimitedString 。
16+
* 该字符串是字典序最大的 repeatLimitedString ,所以返回 "zzcccac" 。
17+
* 注意,尽管 "zzcccca" 字典序更大,但字母 'c' 连续出现超过 3 次,所以它不是一个有效的 repeatLimitedString 。
18+
* 示例 2:
19+
* 输入:s = "aababab", repeatLimit = 2
20+
* 输出:"bbabaa"
21+
* 解释:
22+
* 使用 s 中的一些字符来构造 repeatLimitedString "bbabaa"。
23+
* 字母 'a' 连续出现至多 2 次。
24+
* 字母 'b' 连续出现至多 2 次。
25+
* 因此,没有字母连续出现超过 repeatLimit 次,字符串是一个有效的 repeatLimitedString 。
26+
* 该字符串是字典序最大的 repeatLimitedString ,所以返回 "bbabaa" 。
27+
* 注意,尽管 "bbabaaa" 字典序更大,但字母 'a' 连续出现超过 2 次,所以它不是一个有效的 repeatLimitedString 。
28+
*
29+
* 提示:
30+
* 1 <= repeatLimit <= s.length <= 105
31+
* s 由小写英文字母组成
32+
*
33+
*/
34+
//@Function
35+
const test = () => {
36+
// your code
37+
}
38+
39+
/**
40+
* Test case
41+
*/
42+
//@TestCase
43+
withTimeLog(() => test());
44+
45+
console.log("点击跳转到题目提交:@url")
46+

0 commit comments

Comments
 (0)