001 如果三个正整数A、B、C ,A²+B²=C²则为勾股数

    1. // 题目 001
    2. // import java.util.Scanner;
    3. /**
    4. 如果三个正整数A、B、C ,A²+B²=C²则为勾股数
    5. 如果ABC之间两两互质,即A与B,A与C,B与C均互质没有公约数,
    6. 则称其为勾股数元组。
    7. 请求出给定n~m范围内所有的勾股数元组
    8. */
    9. function solution(n, m) {
    10. let count = 0;
    11. for (let a = n; a < m - 1; a++) {
    12. for (let b = a + 1; b < m; b++) {
    13. for (let c = b + 1; c < m + 1; c++) {
    14. if (relativelyPrime(a, b) &&
    15. relativelyPrime(b, c) &&
    16. relativelyPrime(a, c) &&
    17. a * a + b * b == c * c) {
    18. count++;
    19. console.log(a, b, c);
    20. }
    21. }
    22. }
    23. }
    24. if (count == 0) {
    25. console.log("Na");
    26. }
    27. }
    28. function relativelyPrime(x, y) {
    29. let min = Math.min(x, y);
    30. let sqrt = Math.sqrt(min);
    31. for (let i = 2; i < sqrt; i++) {
    32. if (x % i == 0 && y % i == 0) {
    33. return false;
    34. }
    35. }
    36. return true;
    37. }
    38. function main() {
    39. solution(1, 20);
    40. }
    41. main();

    002 给定两个整数数组,arr1、arr2,数组元素按升序排列;
    假设从arr1、arr2中分别取出一个元素,可构成一对元素;
    现在需要取出k对元素,并对取出的所有元素求和,计算和的最小值;
    注意:两对元素对应arr1、arr2的下标是相同的,视为同一对元素。

    1. // 题目 001
    2. // import java.util.Scanner;
    3. /**
    4. 如果三个正整数A、B、C ,A²+B²=C²则为勾股数
    5. 如果ABC之间两两互质,即A与B,A与C,B与C均互质没有公约数,
    6. 则称其为勾股数元组。
    7. 请求出给定n~m范围内所有的勾股数元组
    8. */
    9. function solution(n, m) {
    10. let count = 0;
    11. for (let a = n; a < m - 1; a++) {
    12. for (let b = a + 1; b < m; b++) {
    13. for (let c = b + 1; c < m + 1; c++) {
    14. if (relativelyPrime(a, b) &&
    15. relativelyPrime(b, c) &&
    16. relativelyPrime(a, c) &&
    17. a * a + b * b == c * c) {
    18. count++;
    19. console.log(a, b, c);
    20. }
    21. }
    22. }
    23. }
    24. if (count == 0) {
    25. console.log("Na");
    26. }
    27. }
    28. function relativelyPrime(x, y) {
    29. let min = Math.min(x, y);
    30. let sqrt = Math.sqrt(min);
    31. for (let i = 2; i < sqrt; i++) {
    32. if (x % i == 0 && y % i == 0) {
    33. return false;
    34. }
    35. }
    36. return true;
    37. }
    38. solution(1, 20);
    39. // 002
    40. // 给定两个整数数组,arr1、arr2,数组元素按升序排列;
    41. // 假设从arr1、arr2中分别取出一个元素,可构成一对元素;
    42. // 现在需要取出k对元素,并对取出的所有元素求和,计算和的最小值;
    43. // 注意:两对元素对应arr1、arr2的下标是相同的,视为同一对元素。
    44. function solution(arr1, arr2, k) {
    45. let sums = [];
    46. arr1.forEach(item => {
    47. arr2.forEach(ele => {
    48. sums.push(Number(item) + Number(ele));
    49. })
    50. });
    51. console.log(sums);
    52. sums.sort();
    53. let res = 0;
    54. for (let i = 0; i < k; i++) {
    55. res += sums[i];
    56. }
    57. console.log(res);
    58. }
    59. solution([1, 1, 2], [1, 2, 3], 2);
    60. // 003 TLV编码是按TagLengthValue格式进行编码的 (代写)
    61. function solution(tag, source) {
    62. let p = 0;
    63. while (p < source.length) {
    64. let curTag = source.substring(p, p + 2);
    65. let lenHEX = source.substring(p + 6, p + 8) + source.substring(p + 3, p + 5);
    66. let lenDEC = parseInt(lenHEX, 16);
    67. console.log(lenDEC);
    68. if (tag === curTag) {
    69. let value = source.substring(p + 9, p + 9 + lenDEC * 3);
    70. console.log(value);
    71. }
    72. p += 9 + lenDEC * 3;
    73. }
    74. }
    75. solution(31, "32 01 00 AE 90 02 00 01 02 30 03 00 AB 32 31 31 02 00 32 33 33 01 00 CC");
    76. // 004 一天一只顽猴想要从山脚爬到山顶
    77. function solution(n) {
    78. let step1 = 1,
    79. step2 = 1,
    80. step3 = 2;
    81. let step4 = n == 1 || n == 2 ? 1 : 2;
    82. for (let i = 4; i <= n; i++) {
    83. step4 = step3 + step1;
    84. step1 = step2;
    85. step2 = step3;
    86. step3 = step4;
    87. }
    88. console.log(step4);
    89. }
    90. solution(50);
    91. // 005
    92. /**
    93. 为了充分发挥Gpu算力,
    94. 需要尽可能多的将任务交给GPU执行,
    95. */
    96. function solution(n, jobCount) {
    97. let time = 0;
    98. let remaining = 0;
    99. jobCount.forEach(count => {
    100. if (count + remaining > n) {
    101. remaining = count + remaining - n;
    102. } else {
    103. remaining = 0;
    104. }
    105. time++;
    106. })
    107. time += remaining / n;
    108. if (remaining % n > 0) {
    109. time++;
    110. }
    111. console.log(time);
    112. }
    113. solution(3, [1, 2, 3, 4, 5]);
    114. // 006
    115. function solution(h, highs) {
    116. highs.sort((h1, h2) => {
    117. let diff1 = Math.abs(h1 - h);
    118. let diff2 = Math.abs(h2 - h);
    119. return diff1 == diff2 ? h1 - h2 : diff1 - diff2;
    120. });
    121. for (let i = 0; i < highs.length; i++) {
    122. console.log(highs[i]);
    123. if (i != highs.length - 1) {
    124. console.log(" ");
    125. }
    126. }
    127. }
    128. solution(100, [95, 96, 97, 98, 99, 101, 102, 103, 104, 105]);
    129. // 007
    130. function solution(line, l, r) {
    131. let words = line.trim().split(" ");
    132. if (r > words.length - 1) r = words.length - 1;
    133. if (words.length == 0 ||
    134. l < 0 ||
    135. r - l <= 0) {
    136. console.log("EMPTY");
    137. return;
    138. }
    139. while (l < r) {
    140. let tmp = words[l];
    141. words[l] = words[r];
    142. words[r] = tmp;
    143. l++;
    144. r--;
    145. }
    146. for (let i = 0; i < words.length; i++) {
    147. console.log(words[i]);
    148. if (i != words.length - 1) {
    149. console.log(" ");
    150. }
    151. }
    152. }
    153. solution("I am a developer.", 0, 3);
    154. // 008
    155. function pay(m, n) {
    156. let split = m.split(",");
    157. let sum = n;
    158. let size = split.length;
    159. let result = -1;
    160. if (size >= 3) {
    161. let irr = [];
    162. for (let i = 0; i < size; i++) {
    163. irr[i] = Number(split[i]);
    164. }
    165. for (let i = 0; i < (size - 2); i++) {
    166. for (let j = i + 1; j < (size - 1); j++) {
    167. for (let k = j + 1; k < size; k++) {
    168. let a = irr[i];
    169. let b = irr[j];
    170. let c = irr[k];
    171. if (a + b + c < sum) {
    172. result = Math.max(result, a + b + c);
    173. }
    174. }
    175. }
    176. }
    177. }
    178. console.log(result);
    179. }
    180. pay("23,26,36,27", 78);
    181. // 009
    182. function solution(str1, str2) {
    183. let chars1 = str1.split('');
    184. chars1.sort();
    185. let chars2 = str2.split('');
    186. let set = new Set();
    187. for (let c of chars2) {
    188. set.add(c);
    189. }
    190. let res = new Set();
    191. for (let c of chars1) {
    192. if (set.has(c)) {
    193. res.add(c);
    194. }
    195. }
    196. for (let Character of res) {
    197. console.log(Character);
    198. }
    199. }
    200. solution("fach", "bbaaccddfg");
    201. // 010
    202. function solution(ints) {
    203. let c = ints[0];
    204. let b = ints[1];
    205. let map = new Map();
    206. for (let i = 2; i < ints.length; i++) {
    207. let r = intByteSum(ints[i]) % b;
    208. if (r < c) map.set(r, map.has(r) ? map.get(r) + 1 : 1);
    209. }
    210. let max = 0;
    211. for (let value of map.values()) {
    212. if (value > max) max = value;
    213. }
    214. console.log(max);
    215. }
    216. function intByteSum(x) {
    217. let sum = 0;
    218. for (let i = 0; i < 4; i++) {
    219. sum += (x >> (i * 8));
    220. }
    221. console.log(sum);
    222. return sum;
    223. }
    224. solution([3, 4, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265]);
    225. solution([1, 4, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265]);
    226. // 011
    227. function solution(treeStr) {
    228. let split = ("0 " + treeStr).split(" ");
    229. let min = 2147483647;
    230. let minPos = 0;
    231. for (let i = 2; i < split.length; i++) {
    232. let tmp = Number(split[i]);
    233. if (tmp != 0 && tmp != -1 && tmp < min) {
    234. min = tmp;
    235. minPos = i;
    236. }
    237. }
    238. let path = [];
    239. back(split, minPos, path);
    240. for (let i = path.length - 1; i >= 0; i--) {
    241. console.log(path[i]);
    242. if (i != 0) {
    243. console.log(" ");
    244. }
    245. }
    246. }
    247. function back(split, minPos, path) {
    248. path.push(split[minPos]);
    249. if (minPos == 1) {
    250. return;
    251. }
    252. if (minPos % 2 == 0) {
    253. back(split, minPos / 2, path);
    254. } else {
    255. back(split, (minPos - 1) / 2, path);
    256. }
    257. }
    258. solution("3 5 7 -1 -1 2 4");
    259. solution("5 9 8 -1 -1 7 -1 -1 -1 -1 -1 6");
    260. // 012
    261. function solution(weightsStr, capacity) {
    262. let split = weightsStr.split(",");
    263. let weights = [];
    264. for (let i = 0; i < split.length; i++) {
    265. weights[i] = Number(split[i]);
    266. }
    267. weights.sort((a, b) => a - b);
    268. let sum = 0;
    269. let i = 0;
    270. while (i < weights.length) {
    271. if (sum + weights[i] <= capacity) {
    272. sum += weights[i++];
    273. } else {
    274. break;
    275. }
    276. }
    277. console.log(i);
    278. }
    279. solution("5,10,2,11", 20);
    280. // 013
    281. /*
    282. 二叉树也可以用数组来存储
    283. 给定一个数组
    284. 树的根节点的值储存在下标1
    285. 对于储存在下标n的节点,
    286. 他的左子节点和右子节点分别储存在下标2*n和2*n+1
    287. 并且我们用-1代表一个节点为空
    288. 给定一个数组存储的二叉树
    289. 试求从根节点到最小的叶子节点的路径
    290. 路径由节点的值组成
    291. 输入描述
    292. 输入一行为数组的内容
    293. 数组的每个元素都是正整数,元素间用空格分割
    294. 注意第一个元素即为根节点的值
    295. 即数组的第n元素对应下标n
    296. 下标0在树的表示中没有使用
    297. 所以我们省略了
    298. 输入的树最多为7层
    299. 输出描述
    300. 输出从根节点到最小叶子节点的路径上各个节点的值
    301. 由空格分割
    302. 用例保证最小叶子节点只有一个
    303. 例子
    304. 输入
    305. 3 5 7 -1 -1 2 4
    306. 输出
    307. 3 7 2
    308. 例子
    309. 输入
    310. 5 9 8 -1 -1 7 -1 -1 -1 -1 -1 6
    311. 输出
    312. 5 8 7 6
    313. */
    314. function main(args) {
    315. let split = args.split(" ");
    316. let tree = [];
    317. tree.push(2147483647);
    318. for (let s of split) {
    319. tree.push(Number(s));
    320. }
    321. let min = 2147483647;
    322. for (let i of tree) {
    323. if (i != 0 && i != -1 && i < min && i !== (tree[1])) min = i;
    324. }
    325. let index = tree.indexOf(min);
    326. let res = [];
    327. res.push(tree[index] + "");
    328. for (let i = index; i > 1;) {
    329. if (i % 2 == 0) i = i / 2;
    330. else i = (i - 1) / 2;
    331. res.push(tree[i] + "");
    332. }
    333. let builder = [];
    334. for (let i = res.length - 1; i >= 0; i--) {
    335. builder.push(res[i]);
    336. }
    337. console.log(builder);
    338. console.log(builder.join(','));
    339. }
    340. main("3 5 7 -1 -1 2 4");
    341. main("5 9 8 -1 -1 7 -1 -1 -1 -1 -1 6");
    342. // 014
    343. /*
    344. 一辆运送快递的货车
    345. 运送的快递放在大小不等的长方体快递盒中
    346. 为了能够装载更多的快递同时不能让货车超载
    347. 需要计算最多能装多少个快递
    348. 注:快递的体积不受限制
    349. 快递数最多1000个
    350. 货车载重最大50000
    351. 输入描述
    352. 第一行输入每个快递的重量
    353. 用英文逗号隔开
    354. 如 5,10,2,11
    355. 第二行输入货车的载重量
    356. 如 20
    357. 输出描述
    358. 输出最多能装多少个快递
    359. 如 3
    360. 示例一
    361. 输入
    362. 5,10,2,11
    363. 20
    364. 输出
    365. 3
    366. */
    367. function main(args, num) {
    368. let split = args.split(",");
    369. let ints = [];
    370. for (let i = 0; i < split.length; i++) {
    371. ints[i] = Number(split[i]);
    372. }
    373. ints.sort((a, b) => a - b);
    374. console.log(ints);
    375. let sum = 0;
    376. for (let i = 0; i < ints.length; i++) {
    377. sum += ints[i];
    378. if (sum > num) {
    379. console.log(i);
    380. break;
    381. }
    382. }
    383. }
    384. main("5,10,2,11", 20);
    385. // 015
    386. function main(args) {
    387. /*
    388. 给航天器一侧加装长方形和正方形的太阳能板(图中的斜线区域)
    389. 需要先安装两个支柱(图中的黑色竖条)
    390. 再在支柱的中间部分固定太阳能板
    391. 但航天器不同位置的支柱长度不同
    392. 太阳能板的安装面积受限于最短一侧的那支支柱的长度
    393. 现提供一组整型数组的支柱高度数据
    394. 假设每个支柱间的距离相等为一个单位长度
    395. 计算如何选择两根支柱可以使太阳能板的面积最大
    396. 输入描述
    397. 10,9,8,7,6,5,4,3,2,1
    398. 注释,支柱至少有两根,最多10000根,能支持的高度范围1~10^9的整数
    399. 柱子的高度是无序的
    400. 例子中的递减是巧合
    401. 输出描述
    402. 可以支持的最大太阳板面积:(10m高支柱和5m高支柱之间)
    403. 25
    404. 示例1
    405. 输入
    406. 10,9,8,7,6,5,4,3,2,1
    407. 输出
    408. 25
    409. 备注 10米高支柱和5米高支柱之间宽度为5,高度取小的支柱高度也是5
    410. 面积为25
    411. 任取其他两根支柱所能获得的面积都小于25 所以最大面积为25
    412. */
    413. let split = args.split(",");
    414. let ints = [];
    415. for (let i = 0; i < split.length; i++) {
    416. ints[i] = Number(split[i]);
    417. }
    418. let res = 0;
    419. for (let i = 0; i < split.length; i++) {
    420. for (let j = i + 1; j < split.length; j++) {
    421. let area = Math.min(ints[i], ints[j]) * (j - i);
    422. if (area > res) res = area;
    423. }
    424. }
    425. console.log(res);
    426. }
    427. main("10,9,8,7,6,5,4,3,2,1");
    428. // 016 (待定)
    429. /*
    430. 单词接龙的规则是
    431. 可用于接龙的单词 首字母必须要与前一个单词的尾字母相同
    432. 当存在多个首字母相同的单词时,取长度最长的单词
    433. 如果长度也相等,则取字典序最小的单词
    434. 已经参与接龙的单词不能重复使用
    435. 现给定一组全部由小写字母组成的单词数组
    436. 并指定其中一个单词为起始单词
    437. 进行单词接龙
    438. 请输出最长的单词串
    439. 单词串是单词拼接而成的中间没有空格
    440. 输入描述
    441. 输入第一行为一个非负整数
    442. 表示起始单词在数组中的索引k
    443. 0<=k<N
    444. 输入的第二行为非负整数N
    445. 接下来的N行分别表示单词数组中的单词
    446. 输出描述,
    447. 输出一个字符串表示最终拼接的单词串
    448. 示例
    449. 0
    450. 6
    451. word
    452. dd
    453. da
    454. dc
    455. dword
    456. d
    457. 输出
    458. worddwordda
    459. 说明 先确定起始单词word 在接dword
    460. 剩余dd da dc 则取da
    461. 示例2
    462. 4
    463. 6
    464. word
    465. dd
    466. da
    467. dc
    468. dword
    469. d
    470. 输出
    471. dwordda
    472. 单词个数1<N<20
    473. 单个单词的长度 1~30
    474. */
    475. function main(k, N, list2) {
    476. let builder = [];
    477. let head = list2[k];
    478. builder.push(head);
    479. list2.slice(k, k + 1);
    480. let list = new Set(list2);
    481. let tail = head.substring(head.length - 1);
    482. while (true) {
    483. let set = new Set();
    484. for (let i = 0; i < list.length; i++) {
    485. let word = list2[i];
    486. if (word.startsWith(tail)) {
    487. set.add(word);
    488. }
    489. }
    490. if (set.length == 0) break;
    491. let first = [...set][0];
    492. set = new Set([...set].pop());
    493. let len;
    494. if (first) {
    495. len = first.length;
    496. }
    497. let aim = "";
    498. for (let s of set) {
    499. if (s.length > len) {
    500. len = s.length;
    501. aim = s;
    502. }
    503. }
    504. let into;
    505. if (first) {
    506. into = len != first.length ? aim : first;
    507. }
    508. if (into) {
    509. tail = into.substring(into.length - 1);
    510. builder.push(into);
    511. list.delete(into);
    512. }
    513. }
    514. console.log(builder.toString());
    515. }
    516. main(4, 6, ['word', 'dd', 'da', 'dc', 'dword', 'd'])
    517. // 017
    518. /*
    519. 给定一个字符串
    520. 只包含大写字母
    521. 求在包含同一字母的子串中
    522. 长度第K长的子串
    523. 相同字母只取最长的子串
    524. 输入
    525. 第一行 一个子串 1<len<=100
    526. 只包含大写字母
    527. 第二行为k的值
    528. 输出
    529. 输出连续出现次数第k多的字母的次数
    530. 例子:
    531. 输入
    532. AABAAA
    533. 2
    534. 输出
    535. 1
    536. 同一字母连续出现最多的A 3次
    537. 第二多2次 但A出现连续3次
    538. 输入
    539. AAAAHHHBBCDHHHH
    540. 3
    541. 输出
    542. 2
    543. //如果子串中只包含同一字母的子串数小于k
    544. 则输出-1
    545. */
    546. function main(args, k) {
    547. let line = args;
    548. let map = new Map();
    549. let chars = line.split('');
    550. if (chars.length == 0) {
    551. console.log(-1);
    552. return;
    553. }
    554. let cur = chars[0];
    555. let count = 1;
    556. map.set(cur, count);
    557. for (let i = 1; i < chars.length; i++) {
    558. let c = chars[i];
    559. if (c == cur) count++;
    560. else {
    561. cur = c;
    562. count = 1;
    563. }
    564. map.set(cur, map.has(cur) ?
    565. map.get(cur) > count ? map.get(cur) : count :
    566. count);
    567. }
    568. let list = [];
    569. for (let entry of map) {
    570. list.push(entry[0] + "-" + entry[1]);
    571. }
    572. list.sort((a, b) => {
    573. return Number(a.split("-")[1]) - Number(b.split("-")[1]);
    574. });
    575. console.log(list, 777);
    576. if (k > list.length) console.log(-1);
    577. else console.log(list[k - 1].split("-")[1]);
    578. }
    579. main("AAAAHHHBBCDHHHH", 3);
    580. main("AABAAA", 2);
    581. // 018
    582. /*
    583. 喊7 是一个传统的聚会游戏
    584. N个人围成一圈
    585. 按顺时针从1-7编号
    586. 编号为1的人从1开始喊数
    587. 下一个人喊得数字是上一个人喊得数字+1
    588. 但是当将要喊出数字7的倍数或者含有7的话
    589. 不能喊出 而是要喊过
    590. 假定N个人都没有失误。
    591. 当喊道数字k时
    592. 可以统计每个人喊 “过"的次数
    593. 现给定一个长度n的数组
    594. 存储打乱的每个人喊”过"的次数
    595. 请把它还原成正确顺序
    596. 即数组的第i个元素存储编号i的人喊“过“的次数
    597. 输入为1行
    598. 空格分割的喊过的次数
    599. 注意k并不提供
    600. k不超过200
    601. 数字个数为n
    602. 输出描述
    603. 输出为1行
    604. 顺序正确的喊过的次数 空格分割
    605. 例子
    606. 输入
    607. 0 1 0
    608. 输出
    609. 1 0 0
    610. 只有一次过
    611. 发生在7
    612. 按顺序编号1的人遇到7 所以100
    613. 结束时的k不一定是7 也可以是 8 9
    614. 喊过都是100
    615. 例子
    616. 输入
    617. 0 0 0 2 1
    618. 输出
    619. 0 2 0 1 0
    620. 一共三次喊过
    621. 发生在7 14 17
    622. 编号为2 的遇到7 17
    623. 编号为4 的遇到14
    624. */
    625. function main(args) {
    626. const str = args.split(" ")
    627. // 得到喊7的总次数
    628. let num = 0
    629. for (const x of str) {
    630. num += parseInt(x, 10)
    631. }
    632. const len = str.length
    633. // 初始化数组:记录每个人喊7的次数
    634. const arr = new Array(len).fill(0)
    635. // index:当前该喊的人
    636. // count:当前喊七的次数
    637. let [index, count] = [1, 0]
    638. while (count < num) {
    639. if ((index.toString(10).indexOf('7') !== -1) || index % 7 === 0) {
    640. // 取余:找到喊当前数的是第一个人
    641. let i = (index % len) - 1
    642. arr[i]++
    643. count++
    644. }
    645. index++
    646. }
    647. // 输出
    648. console.log(arr.join(" "));
    649. }
    650. main("0 0 0 2 1");
    651. // 019
    652. /*
    653. 删除字符串中出现次数最少的字符
    654. 如果多个字符出现次数一样则都删除
    655. 例子:
    656. 输入
    657. abcdd
    658. 字符串中只
    659. 输出
    660. dd
    661. 输入
    662. aabbccdd
    663. 输出
    664. empty
    665. 如果都被删除 则换为empty
    666. */
    667. function main(args) {
    668. let line = args;
    669. let map = new Map();
    670. for (let c of line.split('')) {
    671. map.set(c, map.has(c) ? map.get(c) + 1 : 1);
    672. }
    673. let longs = [...map.values()];
    674. longs.sort();
    675. let min = longs[0];
    676. for (let entry of map) {
    677. if (entry[1] === (min)) {
    678. line = line.replaceAll(entry[0] + "", "");
    679. }
    680. }
    681. console.log(line.length == 0 ? "empty" : line);
    682. }
    683. main("aabbccdd");
    684. main("abcdd");
    685. // 020
    686. /*
    687. 一个正整数数组 设为nums
    688. 最大为100个成员
    689. 求从第一个成员开始正好走到数组最后一个成员所使用的最小步骤数
    690. 3 5 9 4 2 6 8 3 5 4 3 9
    691. 要求:
    692. 1. 第一步 必须从第一元素起 且 1<=第一步步长<len/2 (len为数组长度)
    693. 2. 从第二步开始只能以所在成员的数字走相应的步数,不能多不能少,
    694. 如果目标不可达返回-1
    695. 只输出最小的步骤数量
    696. 3. 只能向数组的尾部走不能向回走
    697. 输入描述:
    698. 有正整数数组 空格分割
    699. 数组长度<100
    700. 输出描述 :
    701. 正整数 最小步数
    702. 不存在输出-1
    703. 例子:
    704. 输入
    705. 7 5 9 4 2 6 8 3 5 4 3 9
    706. 输出
    707. 2
    708. 第一个可选步长选择2
    709. 从第一个成员7开始走两步到9
    710. 第二步:从9经过9个成员到最后
    711. 例子:
    712. 输入
    713. 1 2 3 7 1 5 9 3 2 1
    714. 输出
    715. -1
    716. */
    717. function main(args) {
    718. let split = args.split(" ");
    719. ints = [];
    720. for (let i = 0; i < split.length; i++) {
    721. ints[i] = Number(split[i]);
    722. }
    723. let len = ints.length;
    724. let set = new Set();
    725. for (let i = 1; i < len / 2; i++) {
    726. step = 1;
    727. set.add(inAAA(i, i));
    728. }
    729. console.log(set);
    730. let aaa = [...set];
    731. aaa.shift();
    732. if (set.size != 1) set = new Set(aaa);
    733. console.log([...set][0]);
    734. }
    735. function inAAA(curPos, lastPos) {
    736. let numStep = ints[curPos];
    737. if (lastPos == ints.length - 1) {
    738. return step;
    739. } else if (lastPos < ints.length - 1) {
    740. step++;
    741. return inAAA(lastPos, lastPos + numStep);
    742. } else {
    743. return -1;
    744. }
    745. }
    746. main("1 2 3 7 1 5 9 3 2 1");
    747. main("7 5 9 4 2 6 8 3 5 4 3 9");
    748. // 021
    749. /*
    750. 在通信系统中有一个常见的问题是对用户进行不同策略的调度
    751. 会得到不同系统消耗的性能
    752. 假设由N个待串行用户,每个用户可以使用A/B/C三种不同的调度策略
    753. 不同的策略会消耗不同的系统资源
    754. 请你根据如下规则进行用户调度
    755. 并返回总的消耗资源数
    756. 规则是:相邻的用户不能使用相同的调度策略
    757. 例如:
    758. 第一个用户使用A策略 则第二个用户只能使用B和C策略
    759. 对单的用户而言,不同的调度策略对系统资源的消耗可以规划后抽象为数值
    760. 例如
    761. 某用户分别使用ABC策略的系统消耗,分别为15 8 17
    762. 每个用户依次选择当前所能选择的对系统资源消耗最少的策略,局部最优
    763. 如果有多个满足要求的策略,选最后一个
    764. 输入描述:
    765. 第一行表示用户个数N
    766. 接下来表示每一行表示一个用户分别使用三个策略的资源消耗
    767. resA resB resC
    768. 输出描述:
    769. 最优策略组合下的总的系统消耗资源数
    770. 示例一:
    771. 输入:
    772. 3
    773. 15 8 17
    774. 12 20 9
    775. 11 7 5
    776. 输出:
    777. 24
    778. 说明:
    779. 1号用户使用B策略
    780. 2号用户使用C策略
    781. 3号用户使用B策略
    782. 系统资源消耗8+9+7
    783. */
    784. function main(n, arr) {
    785. let res = [];
    786. for (let i = 0; i < n; i++) {
    787. let split = arr[i].split(" ");
    788. let map = new Map();
    789. for (let j = 0; j < split.length; j++) {
    790. map.set(Number(split[j]), j);
    791. }
    792. res.push(map);
    793. }
    794. console.log(res);
    795. let res1 = [...res[0].keys()][0];
    796. console.log(res1);
    797. let sum = Number(res1);
    798. let type = res[0].get(res1);
    799. console.log(type);
    800. if (res.length > 1) {
    801. for (let i = 1; i < res.length; i++) {
    802. let keyList = [...res[i].keys()];
    803. console.log(keyList);
    804. let resN = keyList[0];
    805. let typeN = res[i].get(resN);
    806. if (typeN !== (type)) {
    807. sum += Number(resN);
    808. type = typeN;
    809. } else {
    810. sum += Number(keyList[1]);
    811. type = res[i].get(keyList[1]);
    812. }
    813. }
    814. }
    815. console.log(sum);
    816. }
    817. main(3, ["15 8 17", "12 20 9", "11 7 5"]);
    818. // dierzhong
    819. function main(N, args) {
    820. let mapList = [];
    821. for (let i = 0; i < N; i++) {
    822. let split = args[i].split(" ");
    823. let map = new Map();
    824. for (let j = 0; j < split.length; j++) {
    825. map.set(Number(split[j]), j);
    826. }
    827. mapList.push(map);
    828. }
    829. let sum = [];
    830. //保证第一个用户每一种策略都使用,并不按最小值来
    831. let keyList = [...mapList[0].keys()];
    832. for (let i = 0; i < 3; i++) {
    833. let res1 = keyList[i];
    834. sum[i] = res1;
    835. let type1 = mapList[0].get(res1);
    836. //其它用户根据在类型不同的情况下,选择调度消耗最小的。
    837. for (let j = 1; j < N; j++) {
    838. let keyNList = [...(mapList[j].keys())];
    839. let resN = keyNList[0];
    840. let typeN = mapList[j].get(resN);
    841. if (typeN != type1) { //当调度类型不同时直接相加
    842. sum[i] += resN;
    843. type1 = typeN;
    844. } else {
    845. resN = keyNList[1]; //相同时,那么下标为1的必定类型不同
    846. sum[i] += resN;
    847. type1 = mapList[j].get(resN);
    848. }
    849. }
    850. }
    851. //因为第一个用户每一种策略都操作了,故选择其中最小值就是所求。
    852. let min = 2147483647;
    853. for (let i of sum) {
    854. if (i < min) min = i;
    855. }
    856. console.log(min);
    857. }
    858. // 022
    859. /*
    860. 现在有多组整数数组
    861. 需要将他们合并成一个新的数组
    862. 合并规则从每个数组里按顺序取出固定长度的内容
    863. 合并到新的数组
    864. 取完的内容会删除掉
    865. 如果改行不足固定长度,或者已经为空
    866. 则直接取出剩余部分的内容放到新的数组中继续下一行
    867. 输入描述
    868. 第一 行每次读取的固定长度
    869. 长度0<len<10
    870. 第二行是整数数组的数目
    871. 数目 0<num<10000
    872. 第3~n行是需要合并的数组
    873. 不同的数组用换行分割
    874. 元素之间用逗号分割
    875. 最大不超过100个元素
    876. 输出描述
    877. 输出一个新的数组,用逗号分割
    878. 示例1
    879. 输入
    880. 3
    881. 2
    882. 2,5,6,7,9,5,7
    883. 1,7,4,3,4
    884. 输出
    885. 2,5,6,1,7,4,7,9,5,3,4,7
    886. 说明 获得长度3和数组数目2
    887. 先遍历第一行 获得2,5,6
    888. 再遍历第二行 获得1,7,4
    889. 再循环回到第一行获得7,9,5
    890. 再遍历第二行获得3,4
    891. 再回到第一行获得7
    892. 示例2
    893. 输入
    894. 4
    895. 3
    896. 1,2,3,4,5,6
    897. 1,2,3
    898. 1,2,3,4
    899. 输出
    900. 1,2,3,4,1,2,3,1,2,3,4,5,6
    901. */
    902. function main(len, num, args) {
    903. let list = [];
    904. let res = [];
    905. let sum = 0;
    906. for (let i = 0; i < num; i++) {
    907. let arr = args[i].split(",");
    908. sum += arr.length;
    909. list.push(arr);
    910. }
    911. while (res.length != sum) {
    912. for (let strList of list) {
    913. if (strList.length == 0) continue;
    914. let times = Math.min(strList.length, len);
    915. for (let i = 0; i < times; i++) {
    916. res.push(strList.shift());
    917. }
    918. }
    919. }
    920. let builder = [];
    921. for (let str of res) {
    922. builder.push(str);
    923. }
    924. let resStr = builder.toString();
    925. console.log(resStr);
    926. }
    927. main(4, 3, ["1,2,3,4,5,6", "1,2,3", "1,2,3,4"])
    928. // 023
    929. /*
    930. 磁盘的容量单位常用的有
    931. M G T
    932. 他们之间的换算关系为 1T =1024G 1G=1024M
    933. 现在给定n块磁盘的容量,请对他们按从小到大的顺序进行稳定排序
    934. 例如给定5块盘的容量
    935. 5
    936. 1T
    937. 20M
    938. 3G
    939. 10G6T
    940. 3M12G9M
    941. 排序后的结果为
    942. 20M
    943. 3G
    944. 3M 12G 9M
    945. 1T,10G 6T
    946. 注意单位可以重复出现
    947. 上述3M 12G 9M表示的容量即为 3M 12G 9M 和12M 12G相等
    948. 输入描述、
    949. 输入第一行包含一个整数n
    950. 2<=n<=100 表示磁盘的个数
    951. 接下来的n行
    952. 每行一个字符串
    953. 2<长度<30
    954. 表示磁盘的容量
    955. 由一个或多个格式为MV的子串组成
    956. 其中m表示容量大小
    957. v表示容量单位
    958. 例如20M 1T
    959. 磁盘容量的范围1~1024的正整数
    960. 单位 M G T
    961. 输出n行
    962. 表示n块磁盘容量排序后的结果
    963. 实例
    964. 输入
    965. 3
    966. 1G
    967. 2G
    968. 1024M
    969. 输出
    970. 1G
    971. 1024M
    972. 2G
    973. 说明:稳定排序要求相等值保留原来位置
    974. 示例2
    975. 3
    976. 2G4m
    977. 3M2G
    978. 1T
    979. 输出
    980. 3M2G
    981. 2G4M
    982. 1T
    983. */
    984. function main(n, args) {
    985. let list = [];
    986. for (let i = 0; i < n; i++) {
    987. list.push(args[i]);
    988. }
    989. list.sort((a, b) => {
    990. return calc(a) - calc(b);
    991. });
    992. for (let s of list) {
    993. console.log(s);
    994. }
    995. }
    996. function calc(str) {
    997. let size = 0;
    998. let upper = str.toUpperCase();
    999. let split = upper.split(/[A-Z]/);
    1000. console.log(split);
    1001. let length = 0;
    1002. for (let s of split) {
    1003. length += s.length;
    1004. let num = Number(s);
    1005. let substring = upper.substring(length, length + 1);
    1006. switch (substring) {
    1007. case "M":
    1008. size += num;
    1009. break;
    1010. case "G":
    1011. size += num * 1024;
    1012. break;
    1013. case "T":
    1014. size += num * 1024 * 1024;
    1015. break;
    1016. }
    1017. length++;
    1018. }
    1019. return size;
    1020. }
    1021. main(3, ['2G4m', '3M2G', '1T'])
    1022. // 024
    1023. /*
    1024. 某学校举行运动会,学生们按编号(1、2、3.....n)进行标识,
    1025. 现需要按照身高由低到高排列,
    1026. 对身高相同的人,按体重由轻到重排列,
    1027. 对于身高体重都相同的人,维持原有的编号顺序关系。
    1028. 请输出排列后的学生编号
    1029. 输入描述:
    1030. 两个序列,每个序列由N个正整数组成,(0<n<=100)。
    1031. 第一个序列中的数值代表身高,第二个序列中的数值代表体重,
    1032. 输出描述:
    1033. 排列结果,每个数据都是原始序列中的学生编号,编号从1开始,
    1034. 实例一:
    1035. 输入:
    1036. 4
    1037. 100 100 120 130
    1038. 40 30 60 50
    1039. 输出:
    1040. 2134
    1041. 身高从低到高
    1042. 身高相同体重从轻到重
    1043. 体重相同维持原来顺序
    1044. 输入
    1045. 4
    1046. 100 100 120 130
    1047. 40 30 60 50
    1048. 输出:
    1049. 2 1 3 4
    1050. 输入
    1051. 3
    1052. 90 110 90
    1053. 45 60 45
    1054. 输出
    1055. 1 3 2
    1056. */
    1057. function main(n, h, w) {
    1058. let ints = [];
    1059. for (let i = 0; i < n; i++) {
    1060. ints[i] = new Array();
    1061. }
    1062. for (let i = 0; i < n; i++) {
    1063. ints[i][0] = i + 1;
    1064. ints[i][1] = Number(h[i]);
    1065. ints[i][2] = Number(w[i]);
    1066. }
    1067. ints.sort((arr1, arr2) => {
    1068. //身高
    1069. if (arr1[1] == arr2[1]) {
    1070. return arr1[2] - arr2[2]
    1071. } else return arr1[1] - arr2[1];
    1072. })
    1073. for (let anInt of ints) {
    1074. console.log(anInt[0] + " ");
    1075. }
    1076. }
    1077. main(4, [100, 100, 120, 130], [40, 30, 60, 50]);
    1078. // 025
    1079. function main(args) {
    1080. /**
    1081. * 输入
    1082. * -1 -3 7 5 11 15
    1083. * 输出
    1084. * -3 5 2
    1085. */
    1086. let numStr = args.split(" ");
    1087. let ints = [];
    1088. for (let i = 0; i < numStr.length; i++) {
    1089. ints[i] = Number(numStr[i]);
    1090. }
    1091. console.log(ints);
    1092. let a = 0,
    1093. b = 0;
    1094. let min = 2147483647;
    1095. for (let i = 0; i < ints.length; i++) {
    1096. for (let j = 0; j < ints.length; j++) {
    1097. let sum = ints[i] + ints[j];
    1098. sum = sum > 0 ? sum : -sum;
    1099. if (i != j && sum < min) {
    1100. a = ints[i];
    1101. b = ints[j];
    1102. min = sum;
    1103. }
    1104. }
    1105. }
    1106. console.log(a + " " + b + " " + min);
    1107. }
    1108. main("-1 -3 7 5 11 15");
    1109. // 026
    1110. /*
    1111. 疫情过后希望小学终于又重新开学了
    1112. 3年2班开学第一天的任务是
    1113. 将后面的黑板报重新制作
    1114. 黑板上已经写上了N个正整数
    1115. 同学们需要给这每个数分别上一种颜色
    1116. 为了让黑板报既美观又有学习意义
    1117. 老师要求同种颜色的所有数都可以被这个颜色中最小的那个数整除
    1118. 现在帮小朋友们算算最少需要多少种颜色,给这N个数进行上色
    1119. 输入描述
    1120. 第一行有一个正整数N
    1121. 其中 1 <= n <=100
    1122. 第二行有N个int型数,保证输入数据在[1,100]范围中
    1123. 表示黑板上各个正整数的值
    1124. 输出描述
    1125. 输出只有一个整数,为最少需要的颜色种数
    1126. 输入
    1127. 3
    1128. 2 4 6
    1129. 输出
    1130. 1
    1131. 说明:
    1132. 所有数都能被2整除
    1133. 输入
    1134. 4
    1135. 2 3 4 9
    1136. 输出
    1137. 2
    1138. 说明:
    1139. 2与4涂一种颜色,4能被2整除
    1140. 3与9涂另一种颜色,9能被3整除
    1141. 不能涂同一种颜色
    1142. */
    1143. function main(nStr, args) {
    1144. let nums = args.split(" ");
    1145. let ints = new Set();
    1146. for (let num of nums) {
    1147. ints.add(Number(num));
    1148. }
    1149. if (ints.has(1)) {
    1150. console.log(1);
    1151. ints.delete(1);
    1152. return;
    1153. }
    1154. let intList = [...ints];
    1155. for (let i = 0; i < intList.length; i++) {
    1156. let cur = intList[i];
    1157. for (let j = i + 1; j < intList.length;) {
    1158. if (intList[j] % cur == 0) {
    1159. // splice
    1160. intList.splice(j, j + 1);
    1161. console.log(intList);
    1162. } else j++;
    1163. }
    1164. }
    1165. console.log(intList.length);
    1166. }
    1167. main(4, "2 3 4 9")
    1168. const a = [1, 2, 3, 4, 5];
    1169. // 删除 0 位置元素,返回 [1]
    1170. let b = a.splice(0, 1)
    1171. console.log(b);
    1172. // 027
    1173. /*
    1174. 给定一个非空数组(列表)
    1175. 起元素数据类型为整型
    1176. 请按照数组元素十进制最低位从小到大进行排序
    1177. 十进制最低位相同的元素,相对位置保持不变
    1178. 当数组元素为负值时,十进制最低为等同于去除符号位后对应十进制值最低位
    1179. 输入描述
    1180. 给定一个非空数组(列表)
    1181. 其元素数据类型为32位有符号整数
    1182. 数组长度为[1,1000]
    1183. 输出排序后的数组
    1184. 输入
    1185. 1,2,5,-21,22,11,55,-101,42,8,7,32
    1186. 输出
    1187. 1,-21,11,-101,2,22,42,32,5,55,7,8
    1188. */
    1189. function main(args) {
    1190. let nums = args.split(",");
    1191. let list = [];
    1192. for (let num of nums) {
    1193. list.push(Number(num));
    1194. }
    1195. list.sort((o1, o2) => {
    1196. return getKey(o1) - getKey(o2);
    1197. });
    1198. function getKey(i) {
    1199. i = i > 0 ? i : -i;
    1200. return i % 10;
    1201. }
    1202. let listStr = list.toString();
    1203. console.log(listStr);
    1204. }
    1205. main("1,2,5,-21,22,11,55,-101,42,8,7,32");
    1206. // 028(有问题)
    1207. /*
    1208. 给定一个数组
    1209. 编写一个函数
    1210. 来计算他的最大N个数和最小N个数的和
    1211. 需要对数组进行去重
    1212. 说明
    1213. 第一行输入M
    1214. M表示数组大小
    1215. 第二行输入M个数
    1216. 表示数组内容
    1217. 第三行输入N表示需要计算的最大最小N的个数
    1218. 输出描述
    1219. 输出最大N个数和最小N个数的和
    1220. 例一:
    1221. 输入
    1222. 5
    1223. 95 88 83 64 100
    1224. 2
    1225. 输出
    1226. 342
    1227. 说明
    1228. 最大2个数[100 95] 最小2个数[83 64]
    1229. 输出342
    1230. 例二
    1231. 输入
    1232. 5
    1233. 3 2 3 4 2
    1234. 2
    1235. 输出
    1236. -1
    1237. 说明
    1238. 最大两个数是[4 3]最小2个数是[3 2]
    1239. 有重叠输出为-1
    1240. */
    1241. function main(m, args, n) {
    1242. let numsStr = args.split(" ");
    1243. let ints = new Set();
    1244. for (let s of numsStr) {
    1245. ints.add(Number(s));
    1246. }
    1247. let res = -1;
    1248. if (ints.size >= 2 * n) {
    1249. res = 0;
    1250. let list = [...ints].sort((a, b) => a - b);
    1251. for (let i = 0; i < list.length; i++) {
    1252. if (i < n || i > list.length - 1 - n) {
    1253. res += list[i];
    1254. }
    1255. }
    1256. }
    1257. console.log(res);
    1258. }
    1259. main(5, "95 88 83 64 100", 2);
    1260. main(5, "3 2 3 4 2", 2);
    1261. // 029
    1262. /*
    1263. 主管期望你来实现英文输入法单词联想功能
    1264. 需求如下
    1265. 依据用户输入的单词前缀
    1266. 从已输入的英文语句中联想出用户想输入的单词
    1267. 按字典序输出联想到的单词序列
    1268. 如果联想不到
    1269. 请输出用户输入的单词前缀
    1270. 注意
    1271. 英文单词联想时区分大小写
    1272. 缩略形式如
    1273. "don't" 判定为两个单词 "don"和 "t"
    1274. 输出的单词序列不能有重复单词
    1275. 且只能是英文单词,不能有标点符号
    1276. 输入描述
    1277. 输入两行
    1278. 首行输入一段由英文单词word和标点构成的语句str
    1279. 接下来一行为一个英文单词前缀pre
    1280. 0 < word.length() <= 20
    1281. 0 < str.length <= 10000
    1282. 0 < pre <=20
    1283. 输出描述
    1284. 输出符合要求的单词序列或单词前缀
    1285. 存在多个时,单词之间以单个空格分割
    1286. 示例一
    1287. 输入
    1288. I love you
    1289. He
    1290. 输出
    1291. He
    1292. 说明
    1293. 用户已输入单词语句"I love you",
    1294. 中提炼出"I","love","you"三个单词
    1295. 接下来用户输入"He" ,
    1296. 从已经输入信息中无法联想到符合要求的单词
    1297. 所以输出用户输入的单词前缀
    1298. 示例二
    1299. 输入
    1300. The furthest distance in the world,Is not between life and death,But when I stand in front or you,Yet you don't know that I love you.
    1301. f
    1302. 输出
    1303. front furthest
    1304. */
    1305. function main(args, pre) {
    1306. let str = args.split(/\W+/);
    1307. let words = new Set(str);
    1308. let buffer = [];
    1309. for (let word of words) {
    1310. if (word.startsWith(pre)) {
    1311. buffer.push(word);
    1312. }
    1313. }
    1314. if (buffer.length === 0) buffer.push(pre);
    1315. console.log(buffer.sort());
    1316. }
    1317. main("The furthest distance in the world,Is not between life and death,But when I stand in front or you,Yet you don't know that I love you.", 'f');
    1318. // 030
    1319. /*
    1320. 给定一个仅包含0和1的n*n二维矩阵
    1321. 请计算二维矩阵的最大值
    1322. 计算规则如下
    1323. 1、每行元素按下标顺序组成一个二进制数(下标越大约排在低位),
    1324. 二进制数的值就是该行的值,矩阵各行之和为矩阵的值
    1325. 2、允许通过向左或向右整体循环移动每个元素来改变元素在行中的位置
    1326. 比如
    1327. [1,0,1,1,1] 向右整体循环移动两位 [1,1,1,0,1]
    1328. 二进制数为11101 值为29
    1329. [1,0,1,1,1] 向左整体循环移动两位 [1,1,1,1,0]
    1330. 二进制数为11110 值为30
    1331. 输入描述
    1332. 1.数据的第一行为正整数,记录了N的大小
    1333. 0<N<=20
    1334. 2.输入的第2到n+1行为二维矩阵信息
    1335. 行内元素边角逗号分割
    1336. 输出描述
    1337. 矩阵的最大值
    1338. 示例1
    1339. 输入
    1340. 5
    1341. 1,0,0,0,1
    1342. 0,0,0,1,1
    1343. 0,1,0,1,0
    1344. 1,0,0,1,1
    1345. 1,0,1,0,1
    1346. 输出
    1347. 122
    1348. 说明第一行向右整体循环移动一位,得到最大值 11000 24
    1349. 因此最大122
    1350. */
    1351. // 怎样算矩阵值
    1352. function main(n, args) {
    1353. let res = 0;
    1354. for (let i = 0; i < n; i++) {
    1355. let ints = [];
    1356. Arrays.stream( in .nextLine().split(","))
    1357. .forEach(x - > ints.add(Number(x)));
    1358. let max = 2147483647;
    1359. for (let j = 0; j < n; j++) {
    1360. ints.addLast(ints.remove(0));
    1361. let binInt = ints.toString()
    1362. .replaceAll("\\W+", "");
    1363. let sum = Number(binInt, 2);
    1364. if (sum > max) max = sum;
    1365. }
    1366. res += max;
    1367. }
    1368. console.log(res);
    1369. }
    1370. }
    1371. main(5, ["1,0,0,0,1", "0,0,0,1,1", "0,1,0,1,0", "1,0,0,1,1", "1,0,1,0,1"])
    1372. // 031
    1373. /*
    1374. 一个整数可以由连续的自然数之和来表示
    1375. 给定一个整数
    1376. 计算该整数有几种连续自然数之和的表达式
    1377. 并打印出每一种表达式
    1378. 输入描述
    1379. 一个目标整数t 1<= t <=1000
    1380. 输出描述
    1381. 1.该整数的所有表达式和表达式的个数
    1382. 如果有多种表达式,自然数个数最少的表达式优先输出
    1383. 2.每个表达式中按自然数递增输出
    1384. 具体的格式参见样例
    1385. 在每个测试数据结束时,输出一行"Result:X"
    1386. 其中X是最终的表达式个数
    1387. 输入
    1388. 9
    1389. 输出
    1390. 9=9
    1391. 9=4+5
    1392. 9=2+3+4
    1393. Result:3
    1394. 说明 整数9有三种表达方法:
    1395. 示例二
    1396. 输入
    1397. 10
    1398. 输出
    1399. 10=10
    1400. 10=1+2+3+4
    1401. Result:2
    1402. */
    1403. function main(t) {
    1404. let res = [t + "=" + t];
    1405. for (let n = 1; n < t; n++) {
    1406. let sum = 0;
    1407. let builder = [];
    1408. for (let i = n; sum < t; i++) {
    1409. sum += i;
    1410. builder.push(i);
    1411. builder.push("+");
    1412. if (sum == t) {
    1413. res.push(t + "=" + builder.join('').substring(0, builder.join('').length - 1));
    1414. break;
    1415. }
    1416. }
    1417. }
    1418. res.sort((a, b) => a.length - b.length);
    1419. res.forEach(item => {
    1420. console.log(item)
    1421. });
    1422. console.log("Result:" + (res.length));
    1423. }
    1424. main(9)
    1425. main(10)
    1426. // 032
    1427. /*
    1428. 有一个N个整数的数组
    1429. 和一个长度为M的窗口
    1430. 窗口从数组内的第一个数开始滑动
    1431. 直到窗口不能滑动为止
    1432. 每次滑动产生一个窗口 和窗口内所有数的和
    1433. 求窗口滑动产生的所有窗口和的最大值
    1434. 输入描述
    1435. 第一行输入一个正整数N
    1436. 表示整数个数 0<N<100000
    1437. 第二行输入N个整数
    1438. 整数取值范围 [-100,100]
    1439. 第三行输入正整数M
    1440. M代表窗口的大小
    1441. M<=100000 并<=N
    1442. 输出描述
    1443. 窗口滑动产生所有窗口和的最大值
    1444. 示例一
    1445. 输入
    1446. 6
    1447. 12 10 20 30 15 23
    1448. 3
    1449. 输出
    1450. 68
    1451. */
    1452. function main(n, args, m) {
    1453. let strs = args.split(" ");
    1454. let ints = [];
    1455. for (let i = 0; i < n; i++) {
    1456. ints[i] = Number(strs[i]);
    1457. }
    1458. let res = [];
    1459. for (let i = 0; i < n - m + 1; i++) {
    1460. let sum = 0;
    1461. for (let j = i; j < i + m; j++) {
    1462. sum += ints[j];
    1463. }
    1464. res.push(sum);
    1465. }
    1466. console.log(Math.max(...res));
    1467. }
    1468. main(6, "12 10 20 30 15 23", 3);
    1469. // 033
    1470. /*
    1471. 有一个简易内存池,内存按照大小粒度分类
    1472. 每个粒度有若干个可用内存资源
    1473. 用户会进行一系列内存申请
    1474. 需要按需分配内存池中的资源
    1475. 返回申请结果成功失败列表
    1476. 分配规则如下
    1477. 1.分配的内存要大于等于内存的申请量
    1478. 存在满足需求的内存就必须分配
    1479. 优先分配粒度小的,但内存不能拆分使用
    1480. 2.需要按申请顺序分配
    1481. 先申请的先分配,有可用内存分配则申请结果为true
    1482. 没有可用则返回false
    1483. 注释:不考虑内存释放
    1484. 输入描述
    1485. 输入为两行字符串
    1486. 第一行为内存池资源列表
    1487. 包含内存粒度数据信息,粒度数据间用逗号分割
    1488. 一个粒度信息内用冒号分割
    1489. 冒号前为内存粒度大小,冒号后为数量
    1490. 资源列表不大于1024
    1491. 每个粒度的数量不大于4096
    1492. 第二行为申请列表
    1493. 申请的内存大小间用逗号分割,申请列表不大于100000
    1494. 64:2,128:1,32:4,1:128
    1495. 50,36,64,128,127
    1496. 输出描述
    1497. 输出为内存池分配结果
    1498. 如true,true,true,false,false
    1499. 示例一:
    1500. 输入:
    1501. 64:2,128:1,32:4,1:128
    1502. 50,36,64,128,127
    1503. 输出:
    1504. true,true,true,false,false
    1505. 说明:
    1506. 内存池资源包含:64k共2个、128k共1个、32k共4个、1k共128个的内存资源
    1507. 针对50,36,64,128,127的内存申请序列,
    1508. 分配的内存依次是,64,64,128,null,null
    1509. 第三次申请内存时已经将128分配出去,因此输出的结果是
    1510. true,true,true,false,false
    1511. */
    1512. function main(args) {
    1513. Scanner in = new Scanner(System.in);
    1514. TreeMap < Integer, Integer > pool = new TreeMap < > ();
    1515. Arrays.stream( in .nextLine().split(","))
    1516. .forEach(x - > {
    1517. let split = x.split(":");
    1518. pool.put(Number(split[0]),
    1519. Number(split[1]));
    1520. });
    1521. let list = Arrays.stream( in .nextLine().split(","))
    1522. .map(Integer::parseInt)
    1523. .collect(Collectors.toList()); in .close();
    1524. let builder = new
    1525. let ();
    1526. for (Integer size: list) {
    1527. boolean flag = false;
    1528. for (Integer k: pool.keySet()) {
    1529. Integer v = pool.get(k);
    1530. if (k >= size && v != 0) {
    1531. builder.append("true,");
    1532. pool.put(k, v - 1);
    1533. flag = true;
    1534. break;
    1535. }
    1536. }
    1537. if (!flag) builder.append("false,");
    1538. }
    1539. console.log(builder.substring(0, builder.length() - 1));
    1540. }
    1541. // 034
    1542. /*
    1543. 1.众数是指一组数据中出现次数多的数
    1544. 众数可以是多个
    1545. 2.中位数是指把一组数据从小到大排列,最中间的那个数,
    1546. 如果这组数据的个数是奇数,那最中间那个就是中位数
    1547. 如果这组数据的个数为偶数,那就把中间的两个数之和除以2就是中位数
    1548. 3.查找整型数组中元素的众数并组成一个新的数组
    1549. 求新数组的中位数
    1550. 输入描述
    1551. 输入一个一维整型数组,数组大小取值范围 0<n<1000
    1552. 数组中每个元素取值范围, 0<e<1000
    1553. 输出描述
    1554. 输出众数组成的新数组的中位数
    1555. 示例一
    1556. 输入:
    1557. 10 11 21 19 21 17 21 16 21 18 16
    1558. 输出
    1559. 21
    1560. 示例二
    1561. 输入
    1562. 2 1 5 4 3 3 9 2 7 4 6 2 15 4 2 4
    1563. 输出
    1564. 3
    1565. 示例三
    1566. 输入
    1567. 5 1 5 3 5 2 5 5 7 6 7 3 7 11 7 55 7 9 98 9 17 9 15 9 9 1 39
    1568. 输出
    1569. 7
    1570. */
    1571. function main(let args) {
    1572. HashMap < Integer, Integer > map = new HashMap < > ();
    1573. Arrays.stream( in .nextLine().split(" "))
    1574. .forEach(x - > {
    1575. let i = Number(x);
    1576. map.put(i, map.getOrDefault(i, 0) + 1);
    1577. });
    1578. Integer max = map.values().stream().max(Integer::compareTo).get();
    1579. let newArr = map.keySet().stream()
    1580. .filter(k - > map.get(k).equals(max))
    1581. .sorted(Integer::compareTo)
    1582. .collect(Collectors.toList());
    1583. Integer res = 0;
    1584. let size = newArr.size();
    1585. if (size % 2 == 0) {
    1586. res = (newArr.get(size / 2) + newArr.get(size / 2 - 1)) / 2;
    1587. } else {
    1588. res = newArr.get(size / 2);
    1589. }
    1590. console.log(res);
    1591. }
    1592. // 035
    1593. /*
    1594. 同一个数轴x有两个点的集合A={A1,A2,...,Am}和B={B1,B2,...,Bm}
    1595. A(i)和B(j)均为正整数
    1596. A、B已经按照从小到大排好序,AB均不为空
    1597. 给定一个距离R 正整数,列出同时满足如下条件的
    1598. (A(i),B(j))数对
    1599. 1. A(i)<=B(j)
    1600. 2. A(i),B(j)之间距离小于等于R
    1601. 3. 在满足1,2的情况下每个A(i)只需输出距离最近的B(j)
    1602. 4. 输出结果按A(i)从小到大排序
    1603. 输入描述
    1604. 第一行三个正整数m n R
    1605. 第二行m个正整数 表示集合A
    1606. 第三行n个正整数 表示集合B
    1607. 输入限制 1<=R<=100000
    1608. 1<=n,m<=100000
    1609. 1<= A(i),B(j) <= 1000000000
    1610. 输出描述
    1611. 每组数对输出一行 A(i)和B(j)
    1612. 以空格隔开
    1613. 示例一
    1614. 输入
    1615. 4 5 5
    1616. 1 5 5 10
    1617. 1 3 8 8 20
    1618. 输出
    1619. 1 1
    1620. 5 8
    1621. 5 8
    1622. */
    1623. function main(str1, str2, str3) {
    1624. let split = str1.split(" ");
    1625. let R = Number(split[2]);
    1626. let A = str2.split(" ")
    1627. let B = str3.split(" ")
    1628. for (let Ai of A) {
    1629. for (let Bj of B) {
    1630. if (Number(Ai) <= Number(Bj) && Number(Bj) - Number(Ai) <= R) {
    1631. console.log(Ai + " " + Bj);
    1632. break;
    1633. }
    1634. }
    1635. }
    1636. }
    1637. main("4 5 5", "1 5 5 10", "1 3 8 8 20");
    1638. // 036
    1639. /*
    1640. 用数组代表每个人的能力
    1641. 一个比赛活动要求 参赛团队的最低能力值为N
    1642. 每个团队可以由一人或者两人组成
    1643. 且一个人只能参加一个团队
    1644. 计算出最多可以派出多少只符合要求的队伍
    1645. 输入描述
    1646. 5
    1647. 3 1 5 7 9
    1648. 8
    1649. 第一行代表总人数,范围 1~500000
    1650. 第二行数组代表每个人的能力
    1651. 数组大小范围 1~500000
    1652. 元素取值范围 1~500000
    1653. 第三行数值为团队要求的最低能力值
    1654. 1~500000
    1655. 输出描述
    1656. 3
    1657. 最多可以派出的团队数量
    1658. 示例一
    1659. 输入
    1660. 5
    1661. 3 1 5 7 9
    1662. 8
    1663. 输出
    1664. 3
    1665. 说明 3、5组成一队 1、7一队 9自己一队 输出3
    1666. 7
    1667. 3 1 5 7 9 2 6
    1668. 8
    1669. 3
    1670. 1 1 9
    1671. 8
    1672. */
    1673. function main(n, args, base) {
    1674. let nums = args.split(" ");
    1675. let list = nums
    1676. .filter(x => x < base)
    1677. .sort()
    1678. let count = nums.length - list.length;
    1679. let i = 0,
    1680. j = list.length - 1;
    1681. while (i < j) {
    1682. if (list[i] + list[j] >= base) {
    1683. count++;
    1684. i++;
    1685. j--;
    1686. } else i++;
    1687. }
    1688. console.log(count);
    1689. }
    1690. main(5, "3 1 5 7 9", 8)
    1691. // 037
    1692. /*
    1693. 一个工厂有m条流水线
    1694. 来并行完成n个独立的作业
    1695. 该工厂设置了一个调度系统
    1696. 在安排作业时,总是优先执行处理时间最短的作业
    1697. 现给定流水线个数m
    1698. 需要完成的作业数n
    1699. 每个作业的处理时间分别为 t1,t2...tn
    1700. 请你编程计算处理完所有作业的耗时为多少
    1701. 当n>m时 首先处理时间短的m个作业进入流水线
    1702. 其他的等待
    1703. 当某个作业完成时,
    1704. 依次从剩余作业中取处理时间最短的
    1705. 进入处理
    1706. 输入描述:
    1707. 第一行为两个整数(采取空格分隔)
    1708. 分别表示流水线个数m和作业数n
    1709. 第二行输入n个整数(采取空格分隔)
    1710. 表示每个作业的处理时长 t1,t2...tn
    1711. 0<m,n<100
    1712. 0<t1,t2...tn<100
    1713. 输出描述
    1714. 输出处理完所有作业的总时长
    1715. 案例
    1716. 输入
    1717. 3 5
    1718. 8 4 3 2 10
    1719. 输出
    1720. 13
    1721. 说明
    1722. 先安排时间为2,3,4的三个作业
    1723. 第一条流水线先完成作业
    1724. 调度剩余时间最短的作业8
    1725. 第二条流水线完成作业
    1726. 调度剩余时间最短的作业10
    1727. 总共耗时 就是二条流水线完成作业时间13(3+10)
    1728. 3 9
    1729. 1 1 1 2 3 4 6 7 8
    1730. */
    1731. function main(let args) {
    1732. Scanner in = new Scanner(System.in);
    1733. let strs = in .nextLine().split(" ");
    1734. let m = Number(strs[0]);
    1735. let n = Number(strs[1]);
    1736. let jobs = Arrays.stream( in .nextLine().split(" "))
    1737. .map(Integer::parseInt)
    1738. .sorted()
    1739. .collect(Collectors.toList()); in .close();
    1740. if (n <= m) {
    1741. console.log(Collections.max(jobs).intValue());
    1742. return;
    1743. }
    1744. let res = [];
    1745. for (let i = 0; i < m; i++) {
    1746. res.add(jobs.get(i));
    1747. }
    1748. for (let i = m; i < jobs.size(); i++) {
    1749. Integer min = res.stream().sorted().iterator().next();
    1750. let index = res.indexOf(min);
    1751. res.set(index, res.get(index) + jobs.get(i));
    1752. }
    1753. Integer maxTime = res.stream().max(Integer::compareTo).get();
    1754. console.log(maxTime);
    1755. }
    1756. // 038
    1757. /*
    1758. 给定一个url前缀和url后缀
    1759. 通过,分割 需要将其连接为一个完整的url
    1760. 如果前缀结尾和后缀开头都没有/
    1761. 需要自动补上/连接符
    1762. 如果前缀结尾和后缀开头都为/
    1763. 需要自动去重
    1764. 约束:
    1765. 不用考虑前后缀URL不合法情况
    1766. 输入描述
    1767. url前缀(一个长度小于100的字符串)
    1768. url后缀(一个长度小于100的字符串)
    1769. 输出描述
    1770. 拼接后的url
    1771. 一、
    1772. 输入
    1773. /acm,/bb
    1774. 输出
    1775. /acm/bb
    1776. 二、
    1777. 输入
    1778. /abc/,/bcd
    1779. 输出
    1780. /abc/bcd
    1781. 三、
    1782. 输入
    1783. /acd,bef
    1784. 输出
    1785. /acd/bef
    1786. 四、
    1787. 输入
    1788. ,
    1789. 输出
    1790. /
    1791. */
    1792. function main(args) {
    1793. let line = args;
    1794. let split = line.split(",");
    1795. if (split.length == 0) {
    1796. console.log("/");
    1797. return;
    1798. }
    1799. let combine = split[0] + "/" + split[1];
    1800. let url = combine.replaceAll("/+", "/");
    1801. console.log(url);
    1802. }
    1803. main("/acd,bef");
    1804. // 039
    1805. public class Main18 {
    1806. function main(let args) {
    1807. /*
    1808. 有一个数列A[n]
    1809. 从A[0]开始每一项都是一个数字
    1810. 数列中A[n+1]都是A[n]的描述
    1811. 其中A[0]=1
    1812. 规则如下
    1813. A[0]:1
    1814. A[1]:11 含义其中A[0]=1是1个1 即11
    1815. 表示A[0]从左到右连续出现了1次1
    1816. A[2]:21 含义其中A[1]=11是2个1 即21
    1817. 表示A[1]从左到右连续出现了2次1
    1818. A[3]:1211 含义其中A[2]从左到右是由一个2和一个1组成 即1211
    1819. 表示A[2]从左到右连续出现了一次2又连续出现了一次1
    1820. A[4]:111221 含义A[3]=1211 从左到右是由一个1和一个2两个1 即111221
    1821. 表示A[3]从左到右连续出现了一次1又连续出现了一次2又连续出现了2次1
    1822. 输出第n项的结果
    1823. 0<= n <=59
    1824. 输入描述:
    1825. 数列第n项 0<= n <=59
    1826. 4
    1827. 输出描述
    1828. 数列内容
    1829. 111221
    1830. */
    1831. Scanner in = new Scanner(System.in);
    1832. let n = Number( in .nextLine()); in .close();
    1833. let next;
    1834. let content = "1";
    1835. if (n == 0) {
    1836. console.log(content);
    1837. return;
    1838. }
    1839. for (let i = 1; i <= n; i++) {
    1840. next = new
    1841. let ();
    1842. let chars = content.toCharArray();
    1843. let last = chars[0];
    1844. let count = 1;
    1845. for (let j = 1; j < chars.length; j++) {
    1846. if (chars[j] == last) count++;
    1847. else {
    1848. next.append(count).append(last);
    1849. count = 1;
    1850. last = chars[j];
    1851. }
    1852. }
    1853. next.append(count).append(last);
    1854. content = next.toString();
    1855. }
    1856. console.log(content);
    1857. }
    1858. }
    1859. // 040
    1860. /*
    1861. 幼儿园两个班的小朋友排队时混在了一起
    1862. 每个小朋友都知道自己跟前面一个小朋友是不是同班
    1863. 请你帮忙把同班的小朋友找出来
    1864. 小朋友的编号为整数
    1865. 与前面一个小朋友同班用Y表示
    1866. 不同班用N表示
    1867. 输入描述:
    1868. 输入为空格分开的小朋友编号和是否同班标志
    1869. 比如 6/N 2/Y 3/N 4/Y
    1870. 表示一共有4位小朋友
    1871. 2和6是同班 3和2不同班 4和3同班
    1872. 小朋友总数不超过999
    1873. 0< 每个小朋友编号 <999
    1874. 不考虑输入格式错误
    1875. 输出两行
    1876. 每一行记录一班小朋友的编号 编号用空格分开
    1877. 并且
    1878. 1. 编号需要按照大小升序排列,分班记录中第一个编号小的排在第一行
    1879. 2. 如果只有一个班的小朋友 第二行为空
    1880. 3. 如果输入不符合要求输出字符串ERROR
    1881. 示例:
    1882. 输入
    1883. 1/N 2/Y 3/N 4/Y
    1884. 输出
    1885. 1 2
    1886. 3 4
    1887. 说明:2的同班标记为Y因此和1同班
    1888. 3的同班标记位N因此和1,2不同班
    1889. 4的同班标记位Y因此和3同班
    1890. */
    1891. function main(let args) {
    1892. Scanner in = new Scanner(System.in);
    1893. let stus = in .nextLine().split(" "); in .close();
    1894. try {
    1895. let c1 = new TreeSet < > ();
    1896. let c2 = new TreeSet < > ();
    1897. boolean is1 = true;
    1898. for (let i = 0; i < stus.length; i++) {
    1899. let split = stus[i].split("/");
    1900. let id = split[0];
    1901. let same = split[1];
    1902. if (i == 0) {
    1903. c1.add(Number(id));
    1904. continue;
    1905. }
    1906. if ("N".equals(same)) is1 = !is1;
    1907. (is1 ? c1 : c2).add(Number(id));
    1908. }
    1909. let b1 = new
    1910. let ();
    1911. for (Integer id: c1) b1.append(id).append(" ");
    1912. if (c2.size() > 0) {
    1913. let b2 = new
    1914. let ();
    1915. for (Integer id: c2) b2.append(id).append(" ");
    1916. if (c1.first() < c2.first()) {
    1917. console.log(b1.toString().trim());
    1918. console.log(b2.toString().trim());
    1919. } else {
    1920. console.log(b2.toString().trim());
    1921. console.log(b1.toString().trim());
    1922. }
    1923. } else {
    1924. console.log(b1.toString().trim());
    1925. }
    1926. } catch (Exception e) {
    1927. console.log("ERROR");
    1928. }
    1929. }
    1930. // 041
    1931. public class Main20 {
    1932. static TreeSet <
    1933. let > set = new TreeSet < > ();
    1934. function main(let args) {
    1935. /*
    1936. 给定参数n 从1到n会有n个整数 1,2,3,...n
    1937. 这n个数字共有n!种排列 按大小顺序升序列出所有排列情况
    1938. 并一一标记
    1939. 当n=3时,所有排列如下
    1940. "123","132","213","231","312","321"
    1941. 给定n和k 返回第n个排列
    1942. 输入描述
    1943. 第一行为n
    1944. 第二行为k
    1945. n的范围是 1~9
    1946. k的范围是 1~n!
    1947. 输出描述
    1948. 输出排列第k位置的数字
    1949. 示例一:
    1950. 输入
    1951. 3
    1952. 3
    1953. 输出
    1954. 213
    1955. 示例二:
    1956. 输入
    1957. 2
    1958. 2
    1959. 输出
    1960. 21
    1961. */
    1962. Scanner in = new Scanner(System.in);
    1963. let n = Number( in .nextLine());
    1964. let k = Number( in .nextLine()); in .close();
    1965. Integer[] arr = new Integer[n];
    1966. for (let i = 0; i < n; i++) {
    1967. arr[i] = i + 1;
    1968. }
    1969. perm(arr, 0, n - 1);
    1970. let res = new ArrayList < > (set).get(k - 1);
    1971. console.log(res);
    1972. }
    1973. function perm(Integer[] array,
    1974. let start,
    1975. let end) {
    1976. if (start == end) {
    1977. let num = Arrays.toString(array).replaceAll("\\W+", "");
    1978. set.add(num);
    1979. } else {
    1980. for (let i = start; i <= end; i++) {
    1981. swap(array, start, i);
    1982. perm(array, start + 1, end);
    1983. swap(array, start, i);
    1984. }
    1985. }
    1986. }
    1987. function swap(Integer[] array,
    1988. let i,
    1989. let j) {
    1990. let temp = array[i];
    1991. array[i] = array[j];
    1992. array[j] = temp;
    1993. }
    1994. }
    1995. // 042
    1996. /*
    1997. Vlan是一种为局域网设备进行逻辑划分的技术
    1998. 为了标识不同的vlan 引入了vlan id 1~4094之间的整数
    1999. 定义一个vlan id 的资源池
    2000. 资源池中连续的vlan用开始vlan-结束vlan表示,
    2001. 不连续的用单个整数表示
    2002. 所有的vlan用英文逗号连接起来
    2003. 现有一个vlan资源池,业务需要从资源池中申请一个vlan
    2004. 需要你输出从vlan资源池中移除申请的vlan后的资源池
    2005. 输入描述
    2006. 第一行为字符串格式的vlan资源池
    2007. 第二行为业务要申请的vlan vlan的取值范围1~4094
    2008. 输出描述
    2009. 从输入vlan资源池中移除申请的vlan后
    2010. 字符串格式的vlan资源池
    2011. 输出要求满足题目中要求的格式,
    2012. 并且要求从小到大升序输出
    2013. 如果申请的vlan不在原资源池,输出升序排序的原资源池的字符串即可
    2014. 示例一
    2015. 输入
    2016. 1-5
    2017. 2
    2018. 输出
    2019. 1,3-5
    2020. 说明:原vlan资源池中有1 2 3 4 5 移除2后
    2021. 剩下的1 3 4 5按照升序排列的方式为 1 3-5
    2022. 示例二
    2023. 输入
    2024. 20-21,15,18,30,5-10
    2025. 15
    2026. 输出
    2027. 5-10,18,20-21,30
    2028. 说明:
    2029. 原vlan资源池中有5 6 7 8 9 10 15 18 20 21 30
    2030. 移除15后 剩下的为 5 6 7 8 9 10 18 20 21 30
    2031. 按照题目描述格式并升序后的结果为5-10,18,20-21,30
    2032. 示例三
    2033. 输入
    2034. 5,1-3
    2035. 10
    2036. 输出
    2037. 1-3,5
    2038. 资源池中有1 2 3 5
    2039. 申请的资源不在资源池中
    2040. 将原池升序输出为1-3,5
    2041. 输入池中vlan数量范围为2~2094的整数
    2042. 资源池中vlan不重复且合法1~2094的整数
    2043. 输入是乱序的
    2044. */
    2045. function main(let args) {
    2046. Scanner in = new Scanner(System.in);
    2047. let input = in .nextLine();
    2048. Integer request = Number( in .nextLine()); in .close();
    2049. let set = new TreeSet < > ();
    2050. for (let str: input.split(",")) {
    2051. if (str.contains("-")) {
    2052. let split = str.split("-");
    2053. let start = Number(split[0]);
    2054. let end = Number(split[1]);
    2055. for (let i = start; i <= end; i++) {
    2056. set.add(i);
    2057. }
    2058. } else {
    2059. set.add(Number(str));
    2060. }
    2061. }
    2062. set.remove(request);
    2063. let list = new ArrayList < > (set);
    2064. let sb = new
    2065. let ();
    2066. Integer start = list.get(0);
    2067. Integer last = start;
    2068. for (let i = 1; i < list.size(); i++) {
    2069. Integer cur = list.get(i);
    2070. if (cur == last + 1) {
    2071. last = cur;
    2072. } else {
    2073. append(sb, start, last);
    2074. start = last = cur;
    2075. }
    2076. }
    2077. append(sb, start, last);
    2078. console.log(sb.substring(0, sb.length() - 1));
    2079. }
    2080. function append(let sb, Integer start, Integer last) {
    2081. if (start.equals(last)) {
    2082. sb.append(last).append(",");
    2083. } else {
    2084. sb.append(start).append("-")
    2085. .append(last).append(",");
    2086. }
    2087. }
    2088. // 043
    2089. /*
    2090. 实现一个整数编码方法
    2091. 使得待编码的数字越小
    2092. 编码后所占用的字节数越小
    2093. 编码规则如下
    2094. 1.编码时7位一组,每个字节的低7位用于存储待编码数字的补码
    2095. 2.字节的最高位表示后续是否还有字节,置1表示后面还有更多的字节,
    2096. 置0表示当前字节为最后一个字节
    2097. 3.采用小端序编码,低位和低字节放在低地址上
    2098. 4.编码结果按16进制数的字符格式进行输出,小写字母需要转化为大写字母
    2099. 输入描述
    2100. 输入的为一个字符串表示的非负整数
    2101. 输出描述
    2102. 输出一个字符串表示整数编码的16进制码流
    2103. 示例一
    2104. 输入
    2105. 0
    2106. 输出
    2107. 00
    2108. 说明:输出的16进制字符不足两位的前面补零
    2109. 示例二
    2110. 输入
    2111. 100
    2112. 输出
    2113. 64
    2114. 说明:100的二进制表示为0110 0100只需一个字节进行编码
    2115. 字节的最高位0,剩余7位存储数字100的低7位(1100100)所以编码后的输出为64
    2116. 示例三
    2117. 输入
    2118. 1000
    2119. 输出
    2120. E807
    2121. 说明
    2122. 1000的二进制表示为 0011 1110 1000 至少需要两个字节进行编码
    2123. 第一个字节最高位是1 剩余7位存储数字 1000的低7位(1101000)
    2124. 所以第一个字节的二进制位(1110 1000)即E8
    2125. 第二个字节最高位置0 剩余的7位存储数字 1000的第二个低7位(0000111)
    2126. 所以第一个字节的二进制为(0000 0111)即07
    2127. 采用小端序编码 所以低字节E8输出在前面
    2128. 高字节07输出在后面
    2129. 备注
    2130. 代编码数字取值范围为 [0,1<<64-1]
    2131. */
    2132. function main(let args) {
    2133. Scanner in = new Scanner(System.in);
    2134. let num = Number( in .nextLine()); in .close();
    2135. let binary = Integer.toBinaryString(num);
    2136. let len = binary.length();
    2137. let sb = new
    2138. let ();
    2139. for (let i = len; i > 0; i -= 7) {
    2140. let start = Math.max(i - 7, 0);
    2141. let bin = binary.substring(start, i);
    2142. if (bin.length() < 7) {
    2143. let head = new
    2144. let ();
    2145. for (let j = 0; j < 7 - bin.length(); j++) {
    2146. head.append("0");
    2147. }
    2148. bin = head.append(bin).toString();
    2149. }
    2150. bin = i - 7 <= 0 ? "0" + bin : "1" + bin;
    2151. let hex = Integer.toHexString(Number(bin, 2)).toUpperCase();
    2152. if (hex.length() == 1) hex = "0" + hex;
    2153. sb.append(hex);
    2154. }
    2155. console.log(sb);
    2156. }
    2157. // 044
    2158. /*
    2159. 有N个正整数组成的一个序列
    2160. 给定一个整数sum
    2161. 求长度最长的的连续子序列使他们的和等于sum
    2162. 返回次子序列的长度
    2163. 如果没有满足要求的序列 返回-1
    2164. 案例1:
    2165. 输入
    2166. 1,2,3,4,2
    2167. 6
    2168. 输出
    2169. 3
    2170. 解析:1,2,3和4,2两个序列均能满足要求
    2171. 所以最长的连续序列为1,2,3 因此结果为3
    2172. 示例2:
    2173. 输入
    2174. 1,2,3,4,2
    2175. 20
    2176. 输出
    2177. -1
    2178. 解释:没有满足要求的子序列,返回-1
    2179. 备注: 输入序列仅由数字和英文逗号构成
    2180. 数字之间采用英文逗号分割
    2181. 序列长度 1<=N<=200
    2182. 输入序列不考虑异常情况
    2183. 由题目保证输入序列满足要求
    2184. */
    2185. function main(let args) {
    2186. Scanner in = new Scanner(System.in);
    2187. let ints = Arrays.stream( in .nextLine().split(","))
    2188. .map(Integer::parseInt)
    2189. .collect(Collectors.toList());
    2190. let sum = Number( in .nextLine()); in .close();
    2191. let max_len = 0;
    2192. for (let i = 0; i < ints.size(); i++) {
    2193. let tmp_sum = 0;
    2194. let sub_len = 0;
    2195. for (let j = i; j < ints.size(); j++) {
    2196. if (tmp_sum > sum) break;
    2197. tmp_sum += ints.get(j);
    2198. sub_len++;
    2199. if (tmp_sum == sum && sub_len > max_len)
    2200. max_len = sub_len;
    2201. }
    2202. }
    2203. max_len = max_len == 0 ? -1 : max_len;
    2204. console.log(max_len);
    2205. }
    2206. // 045
    2207. /*
    2208. 给定一个正整数数组
    2209. 检查数组中是否存在满足规则的数组组合
    2210. 规则:
    2211. A=B+2C
    2212. 输入描述
    2213. 第一行输出数组的元素个数
    2214. 接下来一行输出所有数组元素 用空格隔开
    2215. 输出描述
    2216. 如果存在满足要求的数
    2217. 在同一行里依次输出 规则里 A/B/C的取值 用空格隔开
    2218. 如果不存在输出0
    2219. 示例1:
    2220. 输入
    2221. 4
    2222. 2 7 3 0
    2223. 输出
    2224. 7 3 2
    2225. 说明:
    2226. 7=3+2*2
    2227. 示例2:
    2228. 输入
    2229. 3
    2230. 1 1 1
    2231. 输出
    2232. 0
    2233. 说明找不到满足条件的组合
    2234. 备注:
    2235. 数组长度在3~100之间
    2236. 数组成员为0~65535
    2237. 数组成员可以重复
    2238. 但每个成员只能在结果算式中使用一次
    2239. 如 数组成员为 [0,0,1,5]
    2240. 0出现两次允许,但结果0=0+2*0不允许 因为算式中使用了3个0
    2241. 用例保证每组数字里最多只有一组符合要求的解
    2242. */
    2243. function main(let args) {
    2244. Scanner in = new Scanner(System.in);
    2245. let num = Number( in .nextLine());
    2246. let nums = in .nextLine().split(" "); in .close();
    2247. let intSet = new TreeSet < > ();
    2248. for (let s: nums) {
    2249. intSet.add(Number(s));
    2250. }
    2251. let list = new ArrayList < > (intSet);
    2252. let res = "0";
    2253. for (let a = list.size() - 1; a >= 0; a--) {
    2254. for (let b = 0; b < a; b++) {
    2255. for (let c = 0; c < a; c++) {
    2256. Integer A = list.get(a);
    2257. Integer B = list.get(b);
    2258. Integer C = list.get(c);
    2259. if (A == B + 2 * C) {
    2260. res = A + " " + B + " " + C;
    2261. }
    2262. }
    2263. }
    2264. }
    2265. console.log(res);
    2266. }
    2267. }
    2268. // 046
    2269. /*
    2270. 已知火星人使用的运算符号为#;$
    2271. 其与地球人的等价公式如下
    2272. x#y=2*x+3*y+4
    2273. x$y=3*x+y+2
    2274. x y是无符号整数
    2275. 地球人公式按照c语言规则进行计算
    2276. 火星人公式中$符优先级高于#相同的运算符按从左到右的顺序运算
    2277. 输入描述:
    2278. 火星人字符串表达式结尾不带回车换行
    2279. 输入的字符串说明是 字符串为仅有无符号整数和操作符组成的计算表达式
    2280. 1.用例保证字符串中操作数与操作符之间没有任何分隔符
    2281. 2.用例保证操作数取值范围为32位无符号整数,
    2282. 3.保证输入以及计算结果不会出现整型溢出
    2283. 4.保证输入的字符串为合法的求值报文
    2284. 例如: 123#4$5#76$78
    2285. 5.保证不会出现非法的求值报文
    2286. 例如: #4$5 这种缺少操作数
    2287. 4$5# 这种缺少操作数
    2288. 4#$5 这种缺少操作数
    2289. 4 $5 有空格
    2290. 3+4-5*6/7 有其他操作符
    2291. 12345678987654321$54321 32位整数溢出
    2292. 输出描述:
    2293. 根据火星人字符串输出计算结果
    2294. 结尾不带回车换行
    2295. 案例1:
    2296. 输入:
    2297. 7#6$5#12
    2298. 输出:
    2299. 226
    2300. 说明 示例7#6$5#12=7#(3*6+5+2)#12
    2301. =7#25#12
    2302. =(2*7+3*25+4)#12
    2303. =93#12
    2304. =2*93+3*12+4
    2305. =226
    2306. */
    2307. function main(let args) {
    2308. Scanner in = new Scanner(System.in);
    2309. let input = in .nextLine(); in .close();
    2310. List <
    2311. let > operators = Arrays.stream(input.split("\\w+"))
    2312. .filter(x - > !x.isEmpty())
    2313. .collect(Collectors.toList());
    2314. let nums = Arrays.stream(input.split("\\W+"))
    2315. .map(Integer::parseInt)
    2316. .collect(Collectors.toList());
    2317. let pos$ = operators.indexOf("$");
    2318. while (pos$ != -1) {
    2319. let tmp = dollar(nums.get(pos$), nums.get(pos$ + 1));
    2320. nums.set(pos$, tmp);
    2321. nums.remove(pos$ + 1);
    2322. operators.remove(pos$);
    2323. pos$ = operators.indexOf("$");
    2324. }
    2325. let res = nums.get(0);
    2326. for (let i = 1; i < nums.size(); i++) {
    2327. res = sharp(res, nums.get(i));
    2328. }
    2329. console.log(res);
    2330. }
    2331. public static
    2332. let sharp(let x,
    2333. let y) {
    2334. return 2 * x + 3 * y + 4;
    2335. }
    2336. public static
    2337. let dollar(let x,
    2338. let y) {
    2339. return 3 * x + y + 2;
    2340. }
    2341. }
    2342. // 047
    2343. /*
    2344. 相对开音节构成的结构为辅音+元音(aeiou)+辅音(r除外)+e
    2345. 常见的单词有bike cake
    2346. 给定一个字符串,以空格为分隔符
    2347. 反转每个单词的字母
    2348. 若单词中包含如数字等其他非字母时不进行反转
    2349. 反转后计算其中含有相对开音节结构的子串个数
    2350. (连续子串中部分字符可以重复)
    2351. 输入描述
    2352. 字符串 以空格分割的多个单词
    2353. 长度<10000 字母只考虑小写
    2354. 输出描述
    2355. 含有相对开音节结构的子串个数
    2356. 示例1:
    2357. 输入
    2358. ekam a ekac
    2359. 输出
    2360. 2
    2361. 说明:
    2362. 反转后为 make a cake 其中make和cake为相对开音节子串
    2363. 返回2
    2364. 示例2:
    2365. 输入
    2366. !ekam a ekekac
    2367. 输出
    2368. 2
    2369. 说明
    2370. 反转后为 !ekam a cakeke
    2371. 因为!ekam含有非英文字母,所以未反转
    2372. 其中 cake和keke 为相对开音节子串 返回2
    2373. */
    2374. function main(let args) {
    2375. Scanner in = new Scanner(System.in);
    2376. let line = in .nextLine(); in .close();
    2377. let words = line.split(" ");
    2378. let count = 0;
    2379. for (let word: words) {
    2380. let chars = word.toCharArray();
    2381. if (word.replaceAll("[a-z]+", "").isEmpty()) {
    2382. for (let i = 0, j = chars.length - 1; i < j; i++, j--) {
    2383. let tmp = chars[i];
    2384. chars[i] = chars[j];
    2385. chars[j] = tmp;
    2386. }
    2387. }
    2388. if (chars.length < 4) continue;
    2389. for (let i = 0; i < chars.length - 3; i++) {
    2390. if (!isVowel(chars[i]) &&
    2391. isVowel(chars[i + 1]) &&
    2392. !isVowel(chars[i + 2]) && chars[i + 2] != 'r' &&
    2393. chars[i + 3] == 'e') {
    2394. count++;
    2395. }
    2396. }
    2397. }
    2398. console.log(count);
    2399. }
    2400. private static boolean isVowel(let c) {
    2401. return c == 'a' || c == 'e' || c == 'i' ||
    2402. c == 'o' || c == 'u';
    2403. }
    2404. }
    2405. // 048
    2406. /*
    2407. 给定一个元素类型为小写字符串的数组
    2408. 请计算两个没有相同字符的元素长度乘积的最大值
    2409. 如果没有符合条件的两个元素返回0
    2410. 输入描述
    2411. 输入为一个半角逗号分割的小写字符串数组
    2412. 2<= 数组长度 <=100
    2413. 0< 字符串长度 <=50
    2414. 输出描述
    2415. 两个没有相同字符的元素长度乘积的最大值
    2416. 示例一
    2417. 输入
    2418. iwdvpbn,hk,iuop,iikd,kadgpf
    2419. 输出
    2420. 14
    2421. 说明
    2422. 数组中有5个元组 第一个和第二个元素没有相同字符
    2423. 满足条件 输出7*2=14
    2424. */
    2425. function main(let args) {
    2426. Scanner in = new Scanner(System.in);
    2427. let line = in .nextLine(); in .close();
    2428. let strings = line.split(",");
    2429. let max = 0;
    2430. for (let i = 0; i < strings.length; i++) {
    2431. for (let j = i; j < strings.length; j++) {
    2432. let chars = strings[j].toCharArray();
    2433. let k = 0;
    2434. while (k < chars.length) {
    2435. if (strings[i].indexOf(chars[k]) != -1) break;
    2436. k++;
    2437. }
    2438. let tmp = strings[i].length() * strings[j].length();
    2439. if (k == chars.length && tmp > max) max = tmp;
    2440. }
    2441. }
    2442. console.log(max);
    2443. }
    2444. // 049
    2445. /*
    2446. 一辆运送快递的货车。运送的快递均放在大小不等的长方形快递盒中
    2447. 为了能够装载更多的快递 同时不能让货车超载
    2448. 需要计算最多能装多少个快递
    2449. 快递的体积不受限制
    2450. 快递数量最多1000个
    2451. 货车载重量50000
    2452. 输入描述:
    2453. 第一行输入 每个快递重量 用逗号分隔
    2454. 如5,10,2,11
    2455. 第二行 输入 货车的载重量
    2456. 如20
    2457. 不需要考虑异常输入
    2458. 输出描述:
    2459. 输出最多能装多少个快递
    2460. 货车的载重量为20 最多只能放3种快递 5,10,2因此输出3
    2461. 示例1:
    2462. 输入
    2463. 5,10,2,11
    2464. 20
    2465. 输出
    2466. 3
    2467. */
    2468. function main(args, p) {
    2469. let line = args.split(",");
    2470. let ints = line
    2471. console.log(ints);
    2472. let sum = 0,
    2473. count = 0;
    2474. for (let i of ints) {
    2475. if (sum + Number(i) <= p) {
    2476. sum += Number(i);
    2477. count++;
    2478. } else break;
    2479. }
    2480. console.log(count);
    2481. }
    2482. main("5,10,2,11", 20)
    2483. // 50
    2484. /*
    2485. 小明从糖果盒中随意抓一把糖果
    2486. 每次小明会取出一半的糖果分给同学们
    2487. 当糖果不能平均分配时
    2488. 小明可以从糖果盒中(假设盒中糖果足够)取出一个或放回一个糖果
    2489. 小明至少需要多少次(取出放回和平均分配均记一次)能将手中糖果分至只剩一颗
    2490. 输入描述:
    2491. 抓取糖果数(小于1000000):15
    2492. 输出描述:
    2493. 最少分至一颗糖果的次数:5
    2494. 示例1:
    2495. 输入
    2496. 15
    2497. 输出
    2498. 5
    2499. 备注
    2500. 解释:(1) 15+1=16;
    2501. (2) 16/2=8;
    2502. (3) 8/2=4;
    2503. (4) 4/2=2;
    2504. (5) 2/2=1;
    2505. */
    2506. function main(n) {
    2507. let count = 0;
    2508. for (let i = n; i != 1; i /= 2, count++) {
    2509. if (i == 3) {
    2510. console.log(count += 2);
    2511. return;
    2512. }
    2513. if (i % 2 != 0) {
    2514. if ((i + 1) / 2 % 2 == 0) i++;
    2515. else i--;
    2516. count++;
    2517. }
    2518. }
    2519. console.log(count);
    2520. }
    2521. main(15);
    2522. // 51
    2523. /*
    2524. 输入一个字符串仅包含大小写字母和数字
    2525. 求字符串中包含的最长的非严格递增连续数字序列长度
    2526. 比如:
    2527. 12234属于非严格递增数字序列
    2528. 示例:
    2529. 输入
    2530. abc2234019A334bc
    2531. 输出
    2532. 4
    2533. 说明:
    2534. 2234为最长的非严格递增连续数字序列,所以长度为4
    2535. aaaaaa44ko543j123j7345677781
    2536. aaaaa34567778a44ko543j123j71
    2537. 345678a44ko543j123j7134567778aa
    2538. */
    2539. function main(let args) {
    2540. Scanner in = new Scanner(System.in);
    2541. let line = in .nextLine(); in .close();
    2542. let chars = line.toCharArray();
    2543. let curLen = 0,
    2544. maxLen = 0;
    2545. let last = 'a';
    2546. for (let cur: chars) {
    2547. if (Character.isDigit(cur)) {
    2548. if (curLen == 0) {
    2549. curLen++;
    2550. } else if (cur >= last) {
    2551. curLen++;
    2552. } else {
    2553. if (curLen > maxLen) {
    2554. maxLen = curLen;
    2555. }
    2556. curLen = 1;
    2557. }
    2558. last = cur;
    2559. } else {
    2560. if (curLen > maxLen) maxLen = curLen;
    2561. curLen = 0;
    2562. last = 'a';
    2563. }
    2564. }
    2565. if (curLen > maxLen) {
    2566. maxLen = curLen;
    2567. }
    2568. console.log(maxLen);
    2569. }
    2570. // 52
    2571. /*
    2572. 磁盘的容量单位有M,G,T这三个等级
    2573. 他们之间的换算关系为
    2574. 1T=1024G
    2575. 1G=1024M
    2576. 现在给定N块磁盘的容量
    2577. 请对他们按从小到大的顺序进行稳定排序
    2578. 例如给定5块盘容量
    2579. 1T,20M,3G,10G6T,3M12G9M
    2580. 排序后的结果为20M,3G,3M12G9M,1T,10G6T
    2581. 注意单位可以重复出现
    2582. 上述3M12G9M为 3M+12G+9M和 12M12G相等
    2583. 输入描述:
    2584. 输入第一行包含一个整数N
    2585. 2<=N<=100 ,表示磁盘的个数
    2586. 接下来的N行每行一个字符串 长度 (2<l<30)
    2587. 表示磁盘的容量
    2588. 有一个或多个格式为 mv的子串组成
    2589. 其中m表示容量大小 v表示容量单位
    2590. 例如
    2591. 磁盘容量m的范围 1~1024正整数
    2592. 容量单位v的范围包含题目中提到的M,G,T
    2593. 输出描述:
    2594. 输出N行
    2595. 表示N块磁盘容量排序后的结果
    2596. 示例1:
    2597. 输入
    2598. 3
    2599. 1G
    2600. 2G
    2601. 1024M
    2602. 输出
    2603. 1G
    2604. 1024M
    2605. 2G
    2606. 说明 1G和1024M容量相等,稳定排序要求保留他们原来的相对位置
    2607. 故1G在1024M前
    2608. 示例二:
    2609. 输入
    2610. 3
    2611. 2G4M
    2612. 3M2G
    2613. 1T
    2614. 输出
    2615. 3M2G
    2616. 2G4M
    2617. 1T
    2618. 说明1T大于2G4M大于3M2G
    2619. */
    2620. function main(let args) {
    2621. Scanner in = new Scanner(System.in);
    2622. let N = Number( in .nextLine());
    2623. ArrayList <
    2624. let > sizes = [];
    2625. for (let i = 0; i < N; i++) {
    2626. sizes.add( in .nextLine());
    2627. } in .close();
    2628. sizes.sort(new Comparator <
    2629. let > () {
    2630. @Override
    2631. public
    2632. let compare(let o1,
    2633. let o2) {
    2634. return Long.compare(parseLong(o1), parseLong(o2));
    2635. }
    2636. });
    2637. sizes.forEach(System.out::println);
    2638. }
    2639. static Long parseLong(let size) {
    2640. let units = size.split("[0-9]+");
    2641. let nums = size.split("[A-Z]+");
    2642. //[, M, G, M]
    2643. //[3, 12, 9]
    2644. long sum = 0;
    2645. for (let i = 1; i < units.length; i++) {
    2646. long num = Long.parseLong(nums[i - 1]);
    2647. switch (units[i]) {
    2648. case "M":
    2649. sum += num;
    2650. break;
    2651. case "G":
    2652. sum += num * 1024;
    2653. break;
    2654. case "T":
    2655. sum += num * 1024 * 1024;
    2656. break;
    2657. }
    2658. }
    2659. return sum;
    2660. }
    2661. // 053 90% (自己写)
    2662. /*
    2663. 停车场有一横排车位0代表没有停车,1代表有车.
    2664. 至少停了一辆车在车位上,也至少有一个空位没有停车.
    2665. 为防止刮蹭,需为停车人找到一个车位
    2666. 使得停车人的车最近的车辆的距离是最大的
    2667. 返回此时的最大距离
    2668. 输入描述:
    2669. 1. 一个用半角逗号分割的停车标识字符串,停车标识为0或1,
    2670. 0为空位,1为已停车
    2671. 2. 停车位最多有100个
    2672. 输出描述
    2673. 1. 输出一个整数记录最大距离
    2674. 示例一:
    2675. 输入
    2676. 1,0,0,0,0,1,0,0,1,0,1
    2677. 0,0,1,1,0,0
    2678. 输出
    2679. 2
    2680. 说明
    2681. 当车停在第三个位置上时,离其最近的车距离为2(1~3)
    2682. 当车停在第四个位置上时,离其最近的车距离为2(4~6)
    2683. 其他位置距离为1
    2684. 因此最大距离为2
    2685. */
    2686. function main(line) {
    2687. let sites = line.split(',');
    2688. console.log(sites);
    2689. let max = 0;
    2690. for (let i = 0; i < sites.length; i++) {
    2691. let cur_site = sites[i];
    2692. if (cur_site == '0') {
    2693. let pre = line.indexOf('1', i);
    2694. let suf = line.lastIndexOf('1', i);
    2695. if (pre == -1) pre = 100;
    2696. if (suf == -1) suf = line.length - 1;
    2697. let min = Math.min(pre - i, i - suf);
    2698. if (min > max) max = min;
    2699. }
    2700. }
    2701. console.log(max);
    2702. }
    2703. main("1,0,0,0,0,1,0,0,1,0,1");
    2704. // 054
    2705. /*
    2706. 输入一个英文文章片段
    2707. 翻转指定区间的单词顺序,标点符号和普通字母一样处理
    2708. 例如输入字符串 "I am a developer."
    2709. 区间[0,3]则输出 "developer. a am I"
    2710. 输入描述:
    2711. 使用换行隔开三个参数
    2712. 第一个参数为英文文章内容即英文字符串
    2713. 第二个参数为反转起始单词下标,下标从0开始
    2714. 第三个参数为结束单词下标,
    2715. 输出描述
    2716. 反转后的英文文章片段,所有单词之间以一个半角空格分割进行输出
    2717. 示例一:
    2718. 输入
    2719. I am a developer.
    2720. 1
    2721. 2
    2722. 输出
    2723. I a am developer.
    2724. 示例二:
    2725. 输入
    2726. Hello world!
    2727. 0
    2728. 1
    2729. 输出
    2730. world! Hello
    2731. 说明:
    2732. 输入字符串可以在前面或者后面包含多余的空格,
    2733. 但是反转后的不能包含多余空格
    2734. 示例三:
    2735. 输入:
    2736. I am a developer.
    2737. 0
    2738. 3
    2739. 输出
    2740. developer. a am I
    2741. 说明:
    2742. 如果两个单词见有多余的空格
    2743. 将反转后单词间的空格减少到只含一个
    2744. 示例四:
    2745. 输入
    2746. Hello!
    2747. 0
    2748. 3
    2749. 输出
    2750. EMPTY
    2751. 说明:
    2752. 指定反转区间只有一个单词,或无有效单词则统一输出EMPTY
    2753. */
    2754. function main(let args) {
    2755. Scanner in = new Scanner(System.in);
    2756. let line = in .nextLine();
    2757. let start = Number( in .nextLine());
    2758. let end = Number( in .nextLine()); in .close();
    2759. let words = line.trim().split("\\s+");
    2760. start = Math.max(start, 0);
    2761. end = Math.min(end, words.length - 1);
    2762. if (end == start || start > words.length - 1 || end < 0) {
    2763. console.log("EMPTY");
    2764. } else {
    2765. ArrayList <
    2766. let > list = [];
    2767. list.addAll(Arrays.asList(words).subList(0, start));
    2768. for (let i = end; i >= start; i--) {
    2769. list.add(words[i]);
    2770. }
    2771. list.addAll(Arrays.asList(words).subList(end + 1, words.length));
    2772. let builder = new
    2773. let ();
    2774. for (let word: list) {
    2775. builder.append(word).append(" ");
    2776. }
    2777. let res = builder.toString().trim();
    2778. console.log(res);
    2779. }
    2780. // 055
    2781. /*
    2782. 单词接龙的规则是
    2783. 可用于接龙的单词首字母必须要与前一个单词的尾字母相同
    2784. 当存在多个首字母相同的单词时
    2785. 取长度最长的单词
    2786. 如果长度也相等则取词典序最小的单词
    2787. 已经参与接龙的单词不能重复使用
    2788. 现给定一组全部由小写字母组成的单词数组
    2789. 并指定其中的一个单词为起始单词
    2790. 进行单词接龙
    2791. 请输出最长的单词串
    2792. 单词串是由单词拼接而成 中间没有空格
    2793. 输入描述:
    2794. 输入的第一行为一个非负整数
    2795. 表示起始单词在数组中的索引k 0<=k<=n
    2796. 第二行输入的是一个非负整数表示单词的个数n
    2797. 接下来的n行分别表示单词数组中的单词
    2798. 输出描述:
    2799. 输出一个字符串表示最终拼接的字符串
    2800. 示例1:
    2801. 输入
    2802. 0
    2803. 6
    2804. word
    2805. dd
    2806. da
    2807. dc
    2808. dword
    2809. d
    2810. 输出
    2811. worddwordda
    2812. 说明:
    2813. 先确定起始单词word
    2814. 再确定d开头长度最长的单词dword
    2815. 剩余以d开头且长度最长的由 da dd dc
    2816. 则取字典序最小的da
    2817. 所以最后输出worddwordda
    2818. 示例二:
    2819. 输入:
    2820. 4
    2821. 6
    2822. word
    2823. dd
    2824. da
    2825. dc
    2826. dword
    2827. d
    2828. 输出:
    2829. dwordda
    2830. */
    2831. function main(let args) {
    2832. Scanner in = new Scanner(System.in);
    2833. let k = Number( in .nextLine());
    2834. let n = Number( in .nextLine());
    2835. ArrayList <
    2836. let > words = [];
    2837. for (let i = 0; i < n; i++) {
    2838. words.add( in .nextLine());
    2839. } in .close();
    2840. let builder = new
    2841. let ();
    2842. builder.append(words.get(k));
    2843. words.remove(k);
    2844. words.sort(new Comparator <
    2845. let > () {
    2846. @Override
    2847. public
    2848. let compare(let w1,
    2849. let w2) {
    2850. let len1 = w1.length();
    2851. let len2 = w2.length();
    2852. if (len1 != len2) {
    2853. return len2 - len1;
    2854. } else {
    2855. return w1.compareTo(w2);
    2856. }
    2857. }
    2858. });
    2859. let len;
    2860. do {
    2861. len = builder.length();
    2862. let last = builder.substring(builder.length() - 1);
    2863. for (let i = 0; i < words.size(); i++) {
    2864. let cur = words.get(i);
    2865. if (cur.startsWith(last)) {
    2866. builder.append(cur);
    2867. words.remove(cur);
    2868. break;
    2869. }
    2870. }
    2871. } while (builder.length() != len);
    2872. console.log(builder.toString());
    2873. }
    2874. // 056
    2875. /*
    2876. 为了充分发挥Gpu算力,
    2877. 需要尽可能多的将任务交给GPU执行,
    2878. 现在有一个任务数组,
    2879. 数组元素表示在这1s内新增的任务个数,
    2880. 且每秒都有新增任务,
    2881. 假设GPU最多一次执行n个任务,
    2882. 一次执行耗时1s,
    2883. 在保证Gpu不空闲的情况下,最少需要多长时间执行完成。
    2884. 输入描述
    2885. 第一个参数为gpu最多执行的任务个数
    2886. 取值范围1~10000
    2887. 第二个参数为任务数组的长度
    2888. 取值范围1~10000
    2889. 第三个参数为任务数组
    2890. 数字范围1~10000
    2891. 输出描述
    2892. 执行完所有任务需要多少秒
    2893. 例子
    2894. 输入
    2895. 3
    2896. 5
    2897. 1 2 3 4 5
    2898. 输出
    2899. 6
    2900. 说明,一次最多执行3个任务 最少耗时6s
    2901. 例子2
    2902. 输入
    2903. 4
    2904. 5
    2905. 5 4 1 1 1
    2906. 输出
    2907. 5
    2908. 说明,一次最多执行4个任务 最少耗时5s
    2909. */
    2910. function main(n, len, args) {
    2911. let split = args.split(" ");
    2912. let ints = [];
    2913. for (let i = 0; i < len; i++) {
    2914. ints[i] = Number(split[i]);
    2915. }
    2916. let time = 0;
    2917. let more = 0;
    2918. for (let i of ints) {
    2919. if (i + more > n) more = i + more - n;
    2920. else more = 0;
    2921. time++;
    2922. }
    2923. while (more > 0) {
    2924. more -= n;
    2925. time++;
    2926. }
    2927. console.log(time);
    2928. }
    2929. main(3, 5, "1 2 3 4 5");
    2930. main(4, 5, "5 4 1 1 1");
    2931. // 058
    2932. /*
    2933. 一个工厂有m条流水线
    2934. 来并行完成n个独立的作业
    2935. 该工厂设置了一个调度系统
    2936. 在安排作业时,总是优先执行处理时间最短的作业
    2937. 现给定流水线个数m
    2938. 需要完成的作业数n
    2939. 每个作业的处理时间分别为 t1,t2...tn
    2940. 请你编程计算处理完所有作业的耗时为多少
    2941. 当n>m时 首先处理时间短的m个作业进入流水线
    2942. 其他的等待
    2943. 当某个作业完成时,
    2944. 依次从剩余作业中取处理时间最短的
    2945. 进入处理
    2946. 输入描述:
    2947. 第一行为两个整数(采取空格分隔)
    2948. 分别表示流水线个数m和作业数n
    2949. 第二行输入n个整数(采取空格分隔)
    2950. 表示每个作业的处理时长 t1,t2...tn
    2951. 0<m,n<100
    2952. 0<t1,t2...tn<100
    2953. 输出描述
    2954. 输出处理完所有作业的总时长
    2955. 案例
    2956. 输入
    2957. 3 5
    2958. 8 4 3 2 10
    2959. 输出
    2960. 13
    2961. 说明
    2962. 先安排时间为2,3,4的三个作业
    2963. 第一条流水线先完成作业
    2964. 调度剩余时间最短的作业8
    2965. 第二条流水线完成作业
    2966. 调度剩余时间最短的作业10
    2967. 总共耗时 就是二条流水线完成作业时间13(3+10)
    2968. 3 9
    2969. 1 1 1 2 3 4 6 7 8
    2970. */
    2971. function main(let args) {
    2972. Scanner in = new Scanner(System.in);
    2973. let strs = in .nextLine().split(" ");
    2974. let m = Number(strs[0]);
    2975. let n = Number(strs[1]);
    2976. let split = in .nextLine().split(" ");
    2977. let jobs = new
    2978. let [split.length];
    2979. for (let i = 0; i < split.length; i++) {
    2980. jobs[i] = Number(split[i]);
    2981. }
    2982. Arrays.sort(jobs);
    2983. if (n <= m) {
    2984. console.log(jobs[jobs.length - 1]);
    2985. return;
    2986. }
    2987. let res = [];
    2988. for (let i = 0; i < m; i++) {
    2989. res.add(jobs[i]);
    2990. }
    2991. for (let i = m; i < jobs.length; i++) {
    2992. Integer min = new ArrayList < > (new TreeSet < > (res)).get(0);
    2993. let index = res.indexOf(min);
    2994. res.set(index, res.get(index) + jobs[i]);
    2995. }
    2996. let r = new ArrayList < > (new TreeSet < > (res));
    2997. console.log(r.get(r.size() - 1));
    2998. }
    2999. // 059
    3000. /*
    3001. 公司用一个字符串来标识员工的出勤信息
    3002. absent: 缺勤
    3003. late: 迟到
    3004. leaveearly:早退
    3005. present: 正常上班
    3006. 现需根据员工出勤信息,判断本次是否能获得出勤奖,
    3007. 能获得出勤奖的条件如下:
    3008. 1.缺勤不超过1次
    3009. 2.没有连续的迟到/早退
    3010. 3.任意连续7次考勤 缺勤/迟到/早退 不超过3次
    3011. 输入描述:
    3012. 用户的考勤数据字符串记录条数 >=1
    3013. 输入字符串长度 <10000 ;
    3014. 不存在非法输入
    3015. 如:
    3016. 2
    3017. present
    3018. present absent present present leaveearly present absent
    3019. 输出描述:
    3020. 根据考勤数据字符串
    3021. 如果能得到考勤奖输出true否则输出false
    3022. 对于输出示例的结果应为
    3023. true false
    3024. 示例一:
    3025. 输入:
    3026. 2
    3027. present
    3028. present present
    3029. 输出:
    3030. true true
    3031. 示例二
    3032. 输入:
    3033. 2
    3034. present
    3035. present absent present present leaveearly present absent
    3036. 输出:
    3037. true false
    3038. */
    3039. function main(let args) {
    3040. Scanner in = new Scanner(System.in);
    3041. let n = Number( in .nextLine());
    3042. ArrayList < List <
    3043. let >> days = [];
    3044. for (let i = 0; i < n; i++) {
    3045. let split = in .nextLine().split(" ");
    3046. List <
    3047. let > list = Arrays.stream(split)
    3048. .collect(Collectors.toList());
    3049. days.add(list);
    3050. } in .close();
    3051. let sb = new
    3052. let ();
    3053. for (List <
    3054. let > day: days) {
    3055. //1.缺勤超过1次
    3056. long absent = day.stream()
    3057. .filter(x - > x.equals("absent"))
    3058. .count();
    3059. if (absent > 1) {
    3060. sb.append("false").append(" ");
    3061. continue;
    3062. }
    3063. //2.没有连续的迟到/早退
    3064. boolean flag = true;
    3065. for (let i = 0; i < day.size() - 1; i++) {
    3066. let cur = day.get(i);
    3067. let next = day.get(i + 1);
    3068. if (("late".equals(cur) ||
    3069. "leaveearly".equals(cur)) &&
    3070. ("late".equals(next) ||
    3071. "leaveearly".equals(next))) {
    3072. flag = false;
    3073. break;
    3074. }
    3075. }
    3076. if (!flag) {
    3077. sb.append(flag).append(" ");
    3078. continue;
    3079. }
    3080. //3.任意连续7次考勤 缺勤/迟到/早退 不超过3次
    3081. let ints = new
    3082. let [day.size()];
    3083. for (let i = 0; i < day.size(); i++) {
    3084. ints[i] = "present".equals(day.get(i)) ? 0 : 1;
    3085. }
    3086. if (ints.length <= 7 && Arrays.stream(ints).sum() >= 3) {
    3087. sb.append("false").append(" ");
    3088. } else {
    3089. flag = true;
    3090. for (let i = 0; i < ints.length - 7; i++) {
    3091. let subArr = Arrays.copyOfRange(ints, i, i + 7);
    3092. if (Arrays.stream(subArr).sum() >= 3) {
    3093. flag = false;
    3094. break;
    3095. }
    3096. }
    3097. sb.append(flag).append(" ");
    3098. }
    3099. }
    3100. console.log(sb.substring(0, sb.length() - 1));
    3101. }
    3102. // 060
    3103. /*
    3104. 游戏规则:
    3105. 输入一个只包含英文字母的字符串,
    3106. 字符串中的两个字母如果相邻且相同,就可以消除。
    3107. 在字符串上反复执行消除的动作,
    3108. 直到无法继续消除为止,此时游戏结束。
    3109. 输出最终得到的字符串长度.
    3110. 输入描述:
    3111. 输入原始字符串str
    3112. 只能包含大小写英文字母,字母的大小写敏感,
    3113. str长度不超过100
    3114. 输出描述
    3115. 输出游戏结束后,最终得到的字符串长度
    3116. 示例一:
    3117. 输入
    3118. gg
    3119. 输出
    3120. 0
    3121. 说明 gg可以直接消除 得到空串 长度为0
    3122. 示例2
    3123. 输入:
    3124. mMbccbc
    3125. 0123456
    3126. 输出
    3127. 3
    3128. 说明mMbccbc中 可以先消除cc 此时变为mMbbc
    3129. 再消除 bb 此时变成mMc
    3130. 此时没有相同且相邻的字符 无法继续消除
    3131. 最终得到字符串mMc 长度为3
    3132. 备注:
    3133. 输入中包含非大小写英文字母时
    3134. 均为异常输入
    3135. 直接返回0
    3136. */
    3137. function main(line) {
    3138. // 需要加全局匹配
    3139. if (line.replaceAll(/[a-zA-Z]/g, "")
    3140. .length > 0) {
    3141. console.log(0);
    3142. return;
    3143. }
    3144. let link = [];
    3145. for (let c of line.split('')) {
    3146. link.push(c);
    3147. }
    3148. for (let i = 0; i < link.length - 1;) {
    3149. if (link[i] === (link[i + 1])) {
    3150. link.splice(i, i + 1);
    3151. link.splice(i, i + 1);
    3152. i--;
    3153. i = Math.max(i, 0);
    3154. } else {
    3155. i++;
    3156. }
    3157. }
    3158. console.log(link.length);
    3159. }
    3160. main("mMbccbc");
    3161. // 061
    3162. /*
    3163. 给你两个字符串t和p
    3164. 要求从t中找到一个和p相同的连续子串
    3165. 并输出该子串第一个字符的下标
    3166. 输入描述
    3167. 输入文件包括两行 分别表示字符串t和p
    3168. 保证t的长度不小于p
    3169. 且t的长度不超过1000000
    3170. p的长度不超过10000
    3171. 输出描述
    3172. 如果能从t中找到一个和p相等的连续子串,
    3173. 则输出该子串第一个字符在t中的下标
    3174. 下标从左到右依次为1,2,3,...;
    3175. 如果不能则输出 "No"
    3176. 如果含有多个这样的子串
    3177. 则输出第一个字符下标最小的
    3178. 示例一:
    3179. 输入:
    3180. AVERDXIVYERDIAN
    3181. RDXI
    3182. 输出
    3183. 4
    3184. */
    3185. function main(t, p) {
    3186. let len = p.length;
    3187. for (let i = 0; i <= t.length - len; i++) {
    3188. let substring = t.substring(i, i + len);
    3189. if (substring === (p)) {
    3190. console.log(i + 1);
    3191. return;
    3192. }
    3193. }
    3194. console.log("No");
    3195. }
    3196. main("AVERDXIVYERDIAN", "RDXI")
    3197. // 062
    3198. /*
    3199. 有一种简易压缩算法:针对全部为小写英文字母组成的字符串,
    3200. 将其中连续超过两个相同字母的部分压缩为连续个数加该字母
    3201. 其他部分保持原样不变.
    3202. 例如字符串aaabbccccd 经过压缩变成字符串 3abb4cd
    3203. 请您编写解压函数,根据输入的字符串,
    3204. 判断其是否为合法压缩过的字符串
    3205. 若输入合法则输出解压缩后的字符串
    3206. 否则输出字符串"!error"来报告错误
    3207. 输入描述
    3208. 输入一行,为一个ASCII字符串
    3209. 长度不超过100字符
    3210. 用例保证输出的字符串长度也不会超过100字符串
    3211. 输出描述
    3212. 若判断输入为合法的经过压缩后的字符串
    3213. 则输出压缩前的字符串
    3214. 若输入不合法 则输出字符串"!error"
    3215. 示例一:
    3216. 输入
    3217. 4dff
    3218. 输出
    3219. ddddff
    3220. 说明
    3221. 4d扩展为4个d ,故解压后的字符串为ddddff
    3222. 示例二
    3223. 输入
    3224. 2dff
    3225. 输出
    3226. !error
    3227. 说明
    3228. 2个d不需要压缩 故输入不合法
    3229. 示例三
    3230. 输入
    3231. 4d@A
    3232. 输出
    3233. !error
    3234. 说明
    3235. 全部由小写英文字母做成的字符串,压缩后不会出现特殊字符@和大写字母A
    3236. 故输入不合法
    3237. */
    3238. function main(let args) {
    3239. Scanner in = new Scanner(System.in);
    3240. let line = in .nextLine(); in .close();
    3241. let res = decode(line);
    3242. console.log(res);
    3243. }
    3244. function decode(let line) {
    3245. let fixed = line.replaceAll("[a-z]|[0-9]", "");
    3246. if (fixed.length() > 0) {
    3247. return "!error";
    3248. }
    3249. let res = new
    3250. let ();
    3251. let chars = line.toCharArray();
    3252. let count = 1;
    3253. for (let i = 0; i < chars.length; i++) {
    3254. let cur = chars[i];
    3255. if (Character.isLetter(cur)) {
    3256. if (res.length() > 0 && cur == res.charAt(res.length() - 1)) {
    3257. return "!error";
    3258. }
    3259. for (let j = 0; j < count; j++) {
    3260. res.append(cur);
    3261. }
    3262. count = 1;
    3263. }
    3264. let pos = i;
    3265. while (Character.isDigit(chars[i])) {
    3266. i++;
    3267. }
    3268. if (i > pos) {
    3269. count = Number(line.substring(pos, i--));
    3270. }
    3271. }
    3272. return res.toString();
    3273. }
    3274. // 063
    3275. /*
    3276. 给定两个字符集合
    3277. 一个是全量字符集
    3278. 一个是已占用字符集
    3279. 已占用字符集中的字符不能再使用
    3280. 要求输出剩余可用字符集
    3281. 输入描述
    3282. 1. 输入一个字符串 一定包含@
    3283. @前为全量字符集 @后的为已占用字符集
    3284. 2. 已占用字符集中的字符
    3285. 一定是全量字符集中的字符
    3286. 字符集中的字符跟字符之间使用英文逗号隔开
    3287. 3. 每个字符都表示为字符+数字的形式
    3288. 用英文冒号分隔
    3289. 比如a:1标识一个a字符
    3290. 4. 字符只考虑英文字母,区分大小写
    3291. 数字只考虑正整型 不超过100
    3292. 5. 如果一个字符都没被占用 @标识仍存在
    3293. 例如 a:3,b:5,c:2@
    3294. 输出描述:
    3295. 输出可用字符集
    3296. 不同的输出字符集之间用回车换行
    3297. 注意 输出的字符顺序要跟输入的一致
    3298. 不能输出b:3,a:2,c:2
    3299. 如果某个字符已全部占用 则不需要再输出
    3300. 示例一:
    3301. 输入
    3302. a:3,b:5,c:2@a:1,b:2
    3303. 输出
    3304. a:2,b:3,c:2
    3305. 说明:
    3306. 全量字符集为三个a,5个b,2个c
    3307. 已占用字符集为1个a,2个b
    3308. 由于已占用字符不能再使用
    3309. 因此剩余可用字符为2个a,3个b,2个c
    3310. 因此输出a:2,b:3,c:2
    3311. */
    3312. function main(let args) {
    3313. Scanner in = new Scanner(System.in);
    3314. let split = in .nextLine().split("@"); in .close();
    3315. HashMap <
    3316. let, Info > map = new HashMap < > ();
    3317. let all = split[0].split(",");
    3318. for (let i = 0; i < all.length; i++) {
    3319. let char_count = all[i].split(":");
    3320. let c = char_count[0];
    3321. map.put(c, new Info(c, i, Number(char_count[1])));
    3322. }
    3323. if (split.length > 1)
    3324. for (let s: split[1].split(",")) {
    3325. let char_count = s.split(":");
    3326. let c = char_count[0];
    3327. Info value = map.get(c);
    3328. value.count -= Number(char_count[1]);
    3329. map.put(c, value);
    3330. }
    3331. let sb = new
    3332. let ();
    3333. map.values().stream().filter(x - > x.count > 0)
    3334. .sorted(new Comparator < Info > () {
    3335. @Override
    3336. public
    3337. let compare(Info o1, Info o2) {
    3338. return o1.no - o2.no;
    3339. }
    3340. }).forEach(x - >
    3341. sb.append(x.c)
    3342. .append(":")
    3343. .append(x.count)
    3344. .append(","));
    3345. console.log(sb.substring(0, sb.length() - 1));
    3346. }
    3347. public static class Info {
    3348. public
    3349. let c;
    3350. public
    3351. let no;
    3352. public
    3353. let count;
    3354. public Info(let c,
    3355. let no,
    3356. let count) {
    3357. this.c = c;
    3358. this.no = no;
    3359. this.count = count;
    3360. }
    3361. }
    3362. // 064
    3363. /*
    3364. 绘图机器的绘图笔初始位置在原点(0,0)
    3365. 机器启动后按照以下规则来进行绘制直线
    3366. 1. 尝试沿着横线坐标正向绘制直线
    3367. 直到给定的终点E
    3368. 2. 期间可以通过指令在纵坐标轴方向进行偏移
    3369. offsetY为正数表示正向偏移,为负数表示负向偏移
    3370. 给定的横坐标终点值E 以及若干条绘制指令
    3371. 请计算绘制的直线和横坐标轴以及x=E的直线组成的图形面积
    3372. 输入描述:
    3373. 首行为两个整数N 和 E
    3374. 表示有N条指令,机器运行的横坐标终点值E
    3375. 接下来N行 每行两个整数表示一条绘制指令x offsetY
    3376. 用例保证横坐标x以递增排序的方式出现
    3377. 且不会出现相同横坐标x
    3378. 取值范围:
    3379. 0<N<=10000
    3380. 0<=x<=E<=20000
    3381. -10000<=offsetY<=10000
    3382. 输出描述:
    3383. 一个整数表示计算得到的面积 用例保证结果范围在0到4294967295之内
    3384. 示例1:
    3385. 输入:
    3386. 4 10
    3387. 1 1
    3388. 2 1
    3389. 3 1
    3390. 4 -2
    3391. 输出:
    3392. 12
    3393. 示例2:
    3394. 输入:
    3395. 2 4
    3396. 0 1
    3397. 2 -2
    3398. 输出:
    3399. 4
    3400. */
    3401. function main(s, arr) {
    3402. let split = s.split(" ");
    3403. let N = Number(split[0]);
    3404. let E = Number(split[1]);
    3405. let curX = 0,
    3406. curY = 0,
    3407. area = 0;
    3408. for (let i = 0; i < N; i++) {
    3409. let strs = arr[i].split(" ");
    3410. let x = Number(strs[0]);
    3411. let y = Number(strs[1]);
    3412. area += (x - curX) * Math.abs(curY);
    3413. curX = x;
    3414. curY += y;
    3415. }
    3416. if (curX < E) {
    3417. area += (E - curX) * Math.abs(curY);
    3418. }
    3419. console.log(area);
    3420. }
    3421. main("2 4", ["0 1", "2 -2"]);
    3422. // 065
    3423. /*
    3424. 输入一个由N个大小写字母组成的字符串
    3425. 按照ASCII码值从小到大进行排序
    3426. 查找字符串中第K个最小ASCII码值的字母(k>=1)
    3427. 输出该字母所在字符串中的位置索引(字符串的第一个位置索引为0)
    3428. k如果大于字符串长度则输出最大ASCII码值的字母所在字符串的位置索引
    3429. 如果有重复字母则输出字母的最小位置索引
    3430. 输入描述
    3431. 第一行输入一个由大小写字母组成的字符串
    3432. 第二行输入k k必须大于0 k可以大于输入字符串的长度
    3433. 输出描述
    3434. 输出字符串中第k个最小ASCII码值的字母所在字符串的位置索引
    3435. k如果大于字符串长度则输出最大ASCII码值的字母所在字符串的位置索引
    3436. 如果第k个最小ASCII码值的字母存在重复 则输出该字母的最小位置索引
    3437. 示例一
    3438. 输入
    3439. AbCdeFG
    3440. 3
    3441. 输出
    3442. 5
    3443. 说明
    3444. 根据ASCII码值排序,第三个ASCII码值的字母为F
    3445. F在字符串中位置索引为5(0为字符串的第一个字母位置索引)
    3446. 示例二
    3447. 输入
    3448. fAdDAkBbBq
    3449. 4
    3450. 输出
    3451. 6
    3452. 说明
    3453. 根据ASCII码值排序前4个字母为AABB由于B重复则只取B的第一个最小位置索引6
    3454. 而不是第二个B的位置索引8
    3455. */
    3456. function main(line, k) {
    3457. let chars = line.split('');
    3458. let list = [];
    3459. for (let alet of chars) {
    3460. list.push(aChar);
    3461. }
    3462. list.sort();
    3463. let c = k >= list.length ? list[list.size() - 1] : list[k - 1];
    3464. console.log(line.indexOf(c));
    3465. }
    3466. main('fAdDAkBbBq', 4)
    3467. // 066
    3468. /*
    3469. 定义当一个字符串只有元音字母(a,e,i,o,u,A,E,I,O,U)组成,
    3470. 称为元音字符串,现给定一个字符串,请找出其中最长的元音字符串,
    3471. 并返回其长度,如果找不到请返回0,
    3472. 字符串中任意一个连续字符组成的子序列称为该字符串的子串
    3473. 输入描述:
    3474. 一个字符串其长度 0<length ,字符串仅由字符a-z或A-Z组成
    3475. 输出描述:
    3476. 一个整数,表示最长的元音字符子串的长度
    3477. 示例1:
    3478. 输入
    3479. asdbuiodevauufgh
    3480. 输出
    3481. 3
    3482. 说明:
    3483. 最长的元音字符子串为uio和auu长度都为3,因此输出3
    3484. */
    3485. function main(args) {
    3486. let str = args.toLowerCase();
    3487. let vowel = ['a', 'e', 'i', 'o', 'u'];
    3488. let maxLen = 0,
    3489. tmpLen = 0;
    3490. for (let c of str.split('')) {
    3491. if (vowel.includes(c)) {
    3492. tmpLen++;
    3493. } else {
    3494. maxLen = Math.max(maxLen, tmpLen);
    3495. tmpLen = 0;
    3496. }
    3497. }
    3498. maxLen = Math.max(maxLen, tmpLen);
    3499. console.log(maxLen);
    3500. }
    3501. main("asdbuiodevauufgh")
    3502. // 067 90%
    3503. /*
    3504. 给定一个字符串S
    3505. 变化规则:
    3506. 交换字符串中任意两个不同位置的字符
    3507. 输入描述:
    3508. 一串小写字母组成的字符串
    3509. 输出描述:
    3510. 按照要求变换得到最小字符串
    3511. 实例1:
    3512. 输入:、
    3513. abcdef
    3514. 输出
    3515. abcdef
    3516. 实例2:
    3517. 输入
    3518. bcdefa
    3519. 输出
    3520. acdefb
    3521. s都是小写字符组成
    3522. 1<=s.length<=1000
    3523. */
    3524. function main(let args) {
    3525. Scanner in = new Scanner(System.in);
    3526. let str = in .nextLine(); in .close();
    3527. let chars = str.toCharArray();
    3528. let tmp = chars[0];
    3529. let pos = 0;
    3530. for (let i = 1; i < chars.length; i++) {
    3531. let cur = chars[i];
    3532. if (cur <= tmp) {
    3533. tmp = cur;
    3534. pos = i;
    3535. }
    3536. }
    3537. if (pos != 0) {
    3538. chars[pos] = chars[0];
    3539. chars[0] = tmp;
    3540. }
    3541. console.log(new
    3542. let (chars));
    3543. }
    3544. // 068 100%
    3545. public class Main76 {
    3546. /*
    3547. 给定一个随机的整数数组(可能存在正整数和负整数)nums,
    3548. 请你在该数组中找出两个数,其和的绝对值(|nums[x]+nums[y]|)为最小值
    3549. 并返回这两个数(按从小到大返回)以及绝对值。
    3550. 每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
    3551. 输入描述:
    3552. 一个通过空格空格分割的有序整数序列字符串,最多1000个整数,
    3553. 且整数数值范围是[-65535,65535]
    3554. 输出描述:
    3555. 两个数和两数之和绝对值
    3556. 示例一:
    3557. 输入
    3558. -1 -3 7 5 11 15
    3559. 输出
    3560. -3 5 2
    3561. 说明:
    3562. 因为|nums[0]+nums[2]|=|-3+5|=2最小,
    3563. 所以返回-3 5 2
    3564. */
    3565. function main(let args) {
    3566. Scanner in = new Scanner(System.in);
    3567. let nums = in .nextLine().split(" ");
    3568. in .close();
    3569. let list = Arrays.stream(nums)
    3570. .map(Integer::parseInt)
    3571. .distinct()
    3572. .collect(Collectors.toCollection(ArrayList::new));
    3573. let min = Integer.MAX_VALUE;
    3574. let resSet = new TreeSet < > ();
    3575. for (let i = 0; i < list.size() - 1; i++) {
    3576. for (let j = i; j < list.size(); j++) {
    3577. Integer a = list.get(i);
    3578. Integer b = list.get(j);
    3579. let sum = Math.abs(a + b);
    3580. if (sum < min && a != b) {
    3581. min = sum;
    3582. resSet.clear();
    3583. resSet.add(a);
    3584. resSet.add(b);
    3585. }
    3586. }
    3587. }
    3588. if (resSet.size() != 0) {
    3589. for (Integer integer: resSet) {
    3590. System.out.print(integer + " ");
    3591. }
    3592. console.log(min);
    3593. }
    3594. //-1 -3 7 5 11 15
    3595. }
    3596. }
    3597. // 069 100%
    3598. /*
    3599. 游戏规则:输入一个只包含英文字母的字符串,
    3600. 字符串中的俩个字母如果相邻且相同,就可以消除。
    3601. 在字符串上反复执行消除的动作,
    3602. 直到无法继续消除为止,
    3603. 此时游戏结束。
    3604. 输出最终得到的字符串长度。
    3605. 输出:原始字符串str只能包含大小写英文字母,字母的大小写敏感,长度不超过100,
    3606. 输出游戏结束后字符串的长度
    3607. 备注:输入中包含非大小写英文字母是均为异常输入,直接返回0。
    3608. 事例:mMbccbc输出为3
    3609. */
    3610. function main(let args) {
    3611. Scanner in = new Scanner(System.in);
    3612. let str = in .nextLine(); in .close();
    3613. let len = str.replaceAll("[A-Z]", "")
    3614. .replaceAll("[a-z]", "")
    3615. .length();
    3616. if (len != 0) {
    3617. console.log(0);
    3618. return;
    3619. }
    3620. LinkedList < Character > characters = new LinkedList < > ();
    3621. for (let c: str.toCharArray()) {
    3622. characters.add(c);
    3623. }
    3624. let count = 0;
    3625. while (characters.size() != count) {
    3626. count = characters.size();
    3627. for (let i = 0; i < characters.size() - 1; i++) {
    3628. if (characters.get(i) == characters.get(i + 1)) {
    3629. characters.remove(i);
    3630. characters.remove(i);
    3631. i--;
    3632. }
    3633. }
    3634. }
    3635. console.log(characters.size());
    3636. }
    3637. // 070 100%
    3638. /*
    3639. 所谓的水仙花数是指一个n位的正整数其各位数字的n次方的和等于该数本身,
    3640. 例如153=1^3+5^3+3^3,153是一个三位数
    3641. 输入描述
    3642. 第一行输入一个整数N,
    3643. 表示N位的正整数N在3-7之间包含3,7
    3644. 第二行输入一个正整数M,
    3645. 表示需要返回第M个水仙花数
    3646. 输出描述
    3647. 返回长度是N的第M个水仙花数,
    3648. 个数从0开始编号,
    3649. 若M大于水仙花数的个数返回最后一个水仙花数和M的乘积,
    3650. 若输入不合法返回-1
    3651. 示例一:
    3652. 输入
    3653. 3
    3654. 0
    3655. 输出
    3656. 153
    3657. 说明:153是第一个水仙花数
    3658. 示例二:
    3659. 输入
    3660. 9
    3661. 1
    3662. 输出
    3663. -1
    3664. */
    3665. function main(let args) {
    3666. Scanner in = new Scanner(System.in);
    3667. let N = Number( in .nextLine());
    3668. let M = Number( in .nextLine()); in .close();
    3669. if (N < 3 || N > 7) {
    3670. console.log(-1);
    3671. return;
    3672. }
    3673. Linkedlet res = new LinkedList < > ();
    3674. let start = (let) Math.pow(10, N - 1);
    3675. let end = (let) Math.pow(10, N);
    3676. for (let i = start; i < end; i++) {
    3677. let sum = 0;
    3678. let bit = start;
    3679. while (bit != 1) {
    3680. sum += Math.pow(i / bit % 10, N);
    3681. bit /= 10;
    3682. }
    3683. sum += Math.pow(i % 10, N);
    3684. if (sum == i) {
    3685. res.add(i);
    3686. }
    3687. if (res.size() == M + 1) {
    3688. console.log(i);
    3689. return;
    3690. }
    3691. }
    3692. if (M > res.size()) {
    3693. console.log(M * res.getLast());
    3694. }
    3695. }
    3696. // 071 100%
    3697. /*
    3698. 现在有一队小朋友,他们高矮不同,
    3699. 我们以正整数数组表示这一队小朋友的身高,如数组{5,3,1,2,3}。
    3700. 我们现在希望小朋友排队,以“高”“矮”“高”“矮”顺序排列,
    3701. 每一个“高”位置的小朋友要比相邻的位置高或者相等;
    3702. 每一个“矮”位置的小朋友要比相邻的位置矮或者相等;
    3703. 要求小朋友们移动的距离和最小,第一个从“高”位开始排,输出最小移动距离即可。
    3704. 例如,在示范小队{5,3,1,2,3}中,{5, 1, 3, 2, 3}是排序结果。
    3705. {5, 2, 3, 1, 3} 虽然也满足“高”“矮”“高”“矮”顺序排列,
    3706. 但小朋友们的移动距离大,所以不是最优结果。
    3707. 移动距离的定义如下所示:
    3708. 第二位小朋友移到第三位小朋友后面,移动距离为1,
    3709. 若移动到第四位小朋友后面,移动距离为2;
    3710. 输入描述:
    3711. 排序前的小朋友,以英文空格的正整数:
    3712. 4 3 5 7 8
    3713. 注:小朋友<100个
    3714. 输出描述:
    3715. 排序后的小朋友,以英文空格分割的正整数:
    3716. 4 3 7 5 8
    3717. 备注:4(高)3(矮)7(高)5(矮)8(高),
    3718. 输出结果为最小移动距离,只有5和7交换了位置,移动距离都是1.
    3719. 示例一:
    3720. 输入
    3721. 4 1 3 5 2
    3722. 输出
    3723. 4 1 5 2 3
    3724. 示例二:
    3725. 输入
    3726. 1 1 1 1 1
    3727. 输出
    3728. 1 1 1 1 1
    3729. 说明:相邻位置可以相等
    3730. 示例三:
    3731. 输入:
    3732. xxx
    3733. 输出
    3734. []
    3735. 说明:出现非法参数情况,返回空数组
    3736. */
    3737. function main(let args) {
    3738. Scanner in = new Scanner(System.in);
    3739. let high = null;
    3740. try {
    3741. high = Arrays.stream( in .nextLine().split(" "))
    3742. .map(Integer::parseInt).collect(Collectors.toList());
    3743. } catch (Exception e) {
    3744. console.log("[]");
    3745. return;
    3746. } finally {
    3747. in .close();
    3748. }
    3749. for (let i = 0; i < high.size() - 1; i++) {
    3750. if (i % 2 == 0 && high.get(i) < high.get(i + 1)) {
    3751. swap(high, i, i + 1);
    3752. }
    3753. if (i % 2 == 1 && high.get(i) > high.get(i + 1)) {
    3754. swap(high, i, i + 1);
    3755. }
    3756. }
    3757. let builder = new
    3758. let ();
    3759. high.forEach(x - > builder.append(x).append(" "));
    3760. let res = builder.substring(0, builder.length() - 1);
    3761. console.log(res);
    3762. }
    3763. static void swap(let list,
    3764. let x,
    3765. let y) {
    3766. Integer tmp = list.get(x);
    3767. list.set(x, list.get(y));
    3768. list.set(y, tmp);
    3769. }
    3770. // 072
    3771. /*
    3772. 输入描述:
    3773. 第一行输入N:N表示有N个小朋友
    3774. 第二行输入N个小朋友的身高height[i],都是整数
    3775. 输出描述:
    3776. 输出N个小朋友的好朋友的位置
    3777. 示例一:
    3778. 输入:
    3779. 2
    3780. 100 95
    3781. 输出:
    3782. 0 0
    3783. 说明:
    3784. 第一个小朋友身高100,站在队尾位置,向队首看,
    3785. 没有比他身高高的小朋友,所以输出第一个值为0.
    3786. 第二个小朋友站在队首,前面也没有比他身高高的小朋友,
    3787. 所以输出第二个值为0.
    3788. 示例二:
    3789. 输入
    3790. 8
    3791. 123 124 125 121 119 122 126 123
    3792. 输出
    3793. 1 2 6 5 5 6 0 0
    3794. 说明:
    3795. 123的好朋友是1位置上的124
    3796. 124的好朋友是2位置上的125
    3797. 125的好朋友是6位置上的126
    3798. 以此类推
    3799. */
    3800. function main(let args) {
    3801. Scanner in = new Scanner(System.in); in .nextLine();
    3802. let highs = Arrays.stream( in .nextLine().split(" "))
    3803. .map(Integer::parseInt)
    3804. .collect(Collectors.toList()); in .close();
    3805. let builder = new
    3806. let ();
    3807. for (let i = 0; i < highs.size(); i++) {
    3808. let pos = 0;
    3809. for (let j = i; j < highs.size(); j++) {
    3810. if (highs.get(j) > highs.get(i)) {
    3811. pos = j;
    3812. break;
    3813. }
    3814. }
    3815. builder.append(pos).append(" ");
    3816. }
    3817. console.log(builder.substring(0, builder.length() - 1));
    3818. }
    3819. // 073 85%
    3820. /*
    3821. 给出一个只包含字母的字符串,
    3822. 不包含空格,统计字符串中各个子字母(区分大小写)出现的次数,
    3823. 并按照字母出现次数从大到小的顺序输出各个字母及其出现次数
    3824. 如果次数相同,按照自然顺序排序,且小写字母在大写字母之前
    3825. 输入描述:
    3826. 输入一行仅包含字母的字符串
    3827. 输出描述:
    3828. 按照字母出现次数从大到小的顺序输出各个字母和字母次数,
    3829. 用英文分号分割,
    3830. 注意末尾的分号
    3831. 字母和次数中间用英文冒号分隔
    3832. 示例:
    3833. 输入: xyxyXX
    3834. 输出:x:2;y:2;X:2;
    3835. 说明:每个字符出现的次数为2 故x排在y之前
    3836. 而小写字母x在大写X之前
    3837. 示例2:
    3838. 输入:
    3839. abababb
    3840. 输出:
    3841. b:4;a:3
    3842. 说明:b的出现个数比a多 故排在a前
    3843. */
    3844. function main(let args) {
    3845. Scanner in = new Scanner(System.in);
    3846. let str = in .nextLine(); in .close();
    3847. HashMap < Character, Integer > map = new HashMap < > ();
    3848. for (let c: str.toCharArray()) {
    3849. map.put(c, map.getOrDefault(c, 0) + 1);
    3850. }
    3851. print(map.entrySet().stream().filter(e - > e.getKey() >= 'a'));
    3852. print(map.entrySet().stream().filter(e - > e.getKey() <= 'Z'));
    3853. }
    3854. function print(Stream < Map.Entry < Character, Integer >> stream) {
    3855. List < Map.Entry < Character, Integer >> list = stream
    3856. .sorted((o1, o2) - > {
    3857. let v1 = o1.getValue();
    3858. let k1 = o1.getKey();
    3859. let v2 = o2.getValue();
    3860. let k2 = o2.getKey();
    3861. if (v1 != v2) {
    3862. return v2 - v1;
    3863. } else {
    3864. return k1 - k2;
    3865. }
    3866. }).collect(Collectors.toList());
    3867. let builder = new
    3868. let ();
    3869. for (Map.Entry < Character, Integer > entry: list) {
    3870. builder.append(entry.getKey()).append(":")
    3871. .append(entry.getValue()).append(";");
    3872. }
    3873. System.out.print(builder);
    3874. }
    3875. // 074
    3876. /*
    3877. 特定大小的停车场 数组cars表示
    3878. 其中1表示有车 0表示没车
    3879. 车辆大小不一,小车占一个车位(长度1)
    3880. 货车占两个车位(长度2)
    3881. 卡车占三个车位(长度3)
    3882. 统计停车场最少可以停多少辆车
    3883. 返回具体的数目
    3884. 输入描述:
    3885. 整型字符串数组cars
    3886. 其中1表示有车0表示没车
    3887. 数组长度<1000
    3888. 输出描述:
    3889. 整型数字字符串
    3890. 表示最少停车数
    3891. 示例1:
    3892. 输入
    3893. 1,0,1
    3894. 输出
    3895. 2
    3896. 说明:
    3897. 一个小车占第一个车位
    3898. 第二个车位空,一个小车占第三个车位
    3899. 最少有两辆车
    3900. 示例2:
    3901. 输入:
    3902. 1,1,0,0,1,1,1,0,1
    3903. 输出:
    3904. 3
    3905. 说明:
    3906. 一个货车占第1,2个车位
    3907. 第3,4个车位空
    3908. 一个卡车占第5,6,7个车位
    3909. 第8个车位空
    3910. 一个小车占第9个车位
    3911. 最少3俩个车
    3912. */
    3913. function main(let args) {
    3914. Scanner in = new Scanner(System.in);
    3915. let cars = in .nextLine()
    3916. .replaceAll(",", ""); in .close();
    3917. let count = 0;
    3918. let split = cars.split("[0]+");
    3919. for (let car: split) {
    3920. let len = car.length();
    3921. while (len > 3) {
    3922. count++;
    3923. len -= 3;
    3924. }
    3925. if (len != 0) {
    3926. count++;
    3927. }
    3928. }
    3929. console.log(count);
    3930. }
    3931. // 075
    3932. /*
    3933. 输入一串字符串
    3934. 字符串长度不超过100
    3935. 查找字符串中相同字符连续出现的最大次数
    3936. 输入描述
    3937. 输入只有一行,包含一个长度不超过100的字符串
    3938. 输出描述
    3939. 输出只有一行,输出相同字符串连续出现的最大次数
    3940. 说明:
    3941. 输出
    3942. 示例1:
    3943. 输入
    3944. hello
    3945. 输出
    3946. 2
    3947. 示例2:
    3948. 输入
    3949. word
    3950. 输出
    3951. 1
    3952. 示例3:
    3953. 输入
    3954. aaabbc
    3955. 输出
    3956. 3
    3957. 字符串区分大小写
    3958. */
    3959. function main(let args) {
    3960. Scanner in = new Scanner(System.in);
    3961. let str = in .nextLine(); in .close();
    3962. let chars = str.toCharArray();
    3963. let maxLen = 0;
    3964. for (let i = 0; i < chars.length; i++) {
    3965. let index = i;
    3966. let len = 1;
    3967. while (index + 1 < chars.length && chars[index + 1] == chars[index]) {
    3968. len++;
    3969. index++;
    3970. }
    3971. if (len > maxLen) maxLen = len;
    3972. }
    3973. console.log(maxLen);
    3974. }
    3975. // 076
    3976. /*
    3977. 在学校中
    3978. N个小朋友站成一队
    3979. 第i个小朋友的身高为height[i]
    3980. 第i个小朋友可以看到第一个比自己身高更高的小朋友j
    3981. 那么j是i的好朋友
    3982. (要求:j>i)
    3983. 请重新生成一个列表
    3984. 对应位置的输出是每个小朋友的好朋友的位置
    3985. 如果没有看到好朋友
    3986. 请在该位置用0代替
    3987. 小朋友人数范围 0~40000
    3988. 输入描述:
    3989. 第一行输入N
    3990. N表示有N个小朋友
    3991. 第二行输入N个小朋友的身高height[i]
    3992. 都是整数
    3993. 输出描述:
    3994. 输出N个小朋友的好朋友的位置
    3995. 示例1:
    3996. 输入:
    3997. 2
    3998. 100 95
    3999. 输出
    4000. 0 0
    4001. 说明
    4002. 第一个小朋友身高100站在队伍末尾
    4003. 向队首看 没有比他身高高的小朋友
    4004. 所以输出第一个值为0
    4005. 第二个小朋友站在队首前面也没有比他身高高的小朋友
    4006. 所以输出第二个值为0
    4007. 示例2:
    4008. 输入
    4009. 8
    4010. 123 124 125 121 119 122 126 123
    4011. 输出
    4012. 1 2 6 5 5 6 0 0
    4013. 说明:
    4014. 123的好朋友是1位置上的124
    4015. 124的好朋友是2位置上的125
    4016. 125的好朋友是6位置上的126
    4017. 依此类推
    4018. */
    4019. function main(let args) {
    4020. Scanner in = new Scanner(System.in);
    4021. let n = Number( in .nextLine());
    4022. if (n == 0) {
    4023. console.log(0);
    4024. return;
    4025. }
    4026. let strs = in .nextLine().split(" ");
    4027. let height = Arrays.stream(strs)
    4028. .map(Integer::parseInt)
    4029. .collect(Collectors.toList());
    4030. Linkedlet res = new LinkedList < > ();
    4031. for (let i = 0; i < height.size(); i++) {
    4032. let pos = 0;
    4033. for (let j = i + 1; j < height.size(); j++) {
    4034. if (height.get(j) > height.get(i)) {
    4035. pos = j;
    4036. break;
    4037. }
    4038. }
    4039. res.add(pos);
    4040. }
    4041. let builder = new
    4042. let ();
    4043. res.forEach(x - > builder.append(x).append(" "));
    4044. if (builder.length() > 1) {
    4045. let substring = builder.substring(0, builder.length() - 1);
    4046. console.log(substring);
    4047. }
    4048. }
    4049. // 077
    4050. /*
    4051. 双十一众多商品进行打折销售
    4052. 小明想购买自己心仪的一些物品
    4053. 但由于购买资金限制
    4054. 所以他决定从众多心仪商品中购买三件
    4055. 而且想尽可能得花完资金
    4056. 现在请你设计一个程序 计算小明尽可能花费的最大资金数
    4057. 输入描述:
    4058. 输入第一行为一维整型数组m
    4059. 数组长度小于100
    4060. 数组元素记录单个商品的价格
    4061. 单个商品加个小于1000
    4062. 输入第二行为购买资金的额度r
    4063. r<100000
    4064. 输出描述:
    4065. 输出为满足上述条件的最大花费额度
    4066. 注意:如果不存在满足上述条件的商品请返回-1
    4067. 示例:
    4068. 输入
    4069. 23,26,36,27
    4070. 78
    4071. 输出
    4072. 76
    4073. 说明:
    4074. 金额23、26、27得到76而且最接近且小于输入金额78
    4075. 示例:
    4076. 输入
    4077. 23,30,40
    4078. 26
    4079. 输出
    4080. -1
    4081. 说明
    4082. 因为输入的商品无法满足3件之和小于26
    4083. 故返回-1
    4084. 输入格式正确无需考虑输入错误情况
    4085. */
    4086. function main(args,r) {
    4087. let m = args.split(",")
    4088. for(let i = 0; i < m.length; i++) {
    4089. m[i] = Number(m[i]);
    4090. }
    4091. m.sort((a,b) => a-b);
    4092. let max = -1;
    4093. for (let i = 0; i < m.length - 2; i++) {
    4094. for (let j = 0; j < m.length - 1; j++) {
    4095. for (let k = 0; k < m.length; k++) {
    4096. if (i != j && j != k && i != k) {
    4097. let sum = m[i] + m[j] + m[k];
    4098. if (sum <= r && sum > max) {
    4099. max = sum;
    4100. }
    4101. }
    4102. }
    4103. }
    4104. }
    4105. console.log(max);
    4106. }
    4107. main("23,30,40",26)
    4108. main("23,26,36,27",78)
    4109. // 078
    4110. /*
    4111. 运维工程师采集到某产品线网运行一天产生的日志n条
    4112. 现需根据日志时间先后顺序对日志进行排序
    4113. 日志时间格式为H:M:S.N
    4114. H表示小时(0~23)
    4115. M表示分钟(0~59)
    4116. S表示秒(0~59)
    4117. N表示毫秒(0~999)
    4118. 时间可能并没有补全
    4119. 也就是说
    4120. 01:01:01.001也可能表示为1:1:1.1
    4121. 输入描述
    4122. 第一行输入一个整数n表示日志条数
    4123. 1<=n<=100000
    4124. 接下来n行输入n个时间
    4125. 输出描述
    4126. 按时间升序排序之后的时间
    4127. 如果有两个时间表示的时间相同
    4128. 则保持输入顺序
    4129. 示例:
    4130. 输入:
    4131. 2
    4132. 01:41:8.9
    4133. 1:1:09.211
    4134. 输出
    4135. 1:1:09.211
    4136. 01:41:8.9
    4137. 示例
    4138. 输入
    4139. 3
    4140. 23:41:08.023
    4141. 1:1:09.211
    4142. 08:01:22.0
    4143. 输出
    4144. 1:1:09.211
    4145. 08:01:22.0
    4146. 23:41:08.023
    4147. 示例
    4148. 输入
    4149. 2
    4150. 22:41:08.023
    4151. 22:41:08.23
    4152. 输出
    4153. 22:41:08.023
    4154. 22:41:08.23
    4155. 时间相同保持输入顺序
    4156. */
    4157. function main(n, times) {
    4158. times.sort((a, b) => getTime(a) - getTime(b));
    4159. console.log(times);
    4160. }
    4161. function getTime(str) {
    4162. let t1 = str.split(":");
    4163. let t2 = t1[2].split(/\./);
    4164. let h = Number(t1[0]) * 60 * 60 * 1000;
    4165. let m = Number(t1[1]) * 60 * 1000;
    4166. let s = Number(t2[0]) * 1000;
    4167. let n = Number(t2[1]);
    4168. return h + m + s + n;
    4169. }
    4170. main(3, ["23:41:08.023", "1:1:09.211", "08:01:22.0"]);
    4171. // 080(有问题)
    4172. /*
    4173. 给定参数n,从1到n会有n个整数:1,2,3,...,n,
    4174. 这n个数字共有n!种排列.
    4175. 按大小顺序升序列出所有排列的情况,并一一标记,
    4176. 当n=3时,所有排列如下:
    4177. "123" "132" "213" "231" "312" "321"
    4178. 给定n和k,返回第k个排列.
    4179. 输入描述:
    4180. 输入两行,第一行为n,第二行为k,
    4181. 给定n的范围是[1,9],给定k的范围是[1,n!]。
    4182. 输出描述:
    4183. 输出排在第k位置的数字。
    4184. 实例1:
    4185. 输入:
    4186. 3
    4187. 3
    4188. 输出:
    4189. 213
    4190. 说明
    4191. 3的排列有123,132,213...,那么第三位置就是213
    4192. 实例2:
    4193. 输入
    4194. 2
    4195. 2
    4196. 输出:
    4197. 21
    4198. 说明
    4199. 2的排列有12,21,那么第二位置的为21
    4200. */
    4201. function main(n,k) {
    4202. let sb = [];
    4203. let candidates = [];
    4204. let factorials = [];
    4205. factorials[0] = 1;
    4206. let fact = 1;
    4207. for (let i = 1; i <= n; ++i) {
    4208. candidates.push(i);
    4209. fact *= i;
    4210. factorials[i] = fact;
    4211. }
    4212. k -= 1;
    4213. for (let i = n - 1; i >= 0; --i) {
    4214. // 计算候选数字的index
    4215. let index = k / factorials[i];
    4216. sb.push(candidates.splice(index,index+1));
    4217. k -= index * factorials[i];
    4218. }
    4219. console.log(sb);
    4220. }
    4221. main(2,2);
    4222. main(3,3);
    4223. // 081
    4224. /*
    4225. 程序员小明打了一辆出租车去上班。出于职业敏感,他注意到这辆出租车的计费表有点问题,总是偏大。
    4226. 出租车司机解释说他不喜欢数字4,所以改装了计费表,任何数字位置遇到数字4就直接跳过,其余功能都正常。
    4227. 比如:
    4228. 1. 23再多一块钱就变为25;
    4229. 2. 39再多一块钱变为50;
    4230. 3. 399再多一块钱变为500;
    4231. 小明识破了司机的伎俩,准备利用自己的学识打败司机的阴谋。
    4232. 给出计费表的表面读数,返回实际产生的费用。
    4233. 输入描述:
    4234. 只有一行,数字N,表示里程表的读数。
    4235. (1<=N<=888888888)。
    4236. 输出描述:
    4237. 一个数字,表示实际产生的费用。以回车结束。
    4238. 示例1:
    4239. 输入
    4240. 5
    4241. 输出
    4242. 4
    4243. 说明
    4244. 5表示计费表的表面读数。
    4245. 表示实际产生的费用其实只有4块钱。
    4246. 示例2:
    4247. 输入
    4248. 17
    4249. 输出
    4250. 15
    4251. 说明
    4252. 17表示计费表的表面读数。
    4253. 15表示实际产生的费用其实只有15块钱。
    4254. 示例3:
    4255. 输入
    4256. 100
    4257. 输出
    4258. 81
    4259. 说明:100表示计费表的表面读数,81表示实际产生的费用其实只有81块钱
    4260. */
    4261. function main(N) {
    4262. let ans = N,
    4263. temp = 0,
    4264. k = 0,
    4265. j = 1;
    4266. while (N > 0) {
    4267. //先判断个位上是否跳了4,如果个位上是5~9,就先temp=1。
    4268. if (N % 10 > 4) {
    4269. temp += (N % 10 - 1) * k + j;
    4270. } else {
    4271. temp += (N % 10) * k;
    4272. }
    4273. k = k * 9 + j; //k代表跳了多少次4,多收了多少个1元
    4274. j *= 10; //j代表位数,1代表个位,10代表十位
    4275. N = Math.floor(N / 10); //相当于将N整体右移一位
    4276. console.log(N);
    4277. }
    4278. console.log(ans - temp);
    4279. }
    4280. main(100)
    4281. // 082 100%
    4282. /*
    4283. 1.输入字符串s输出s中包含所有整数的最小和,
    4284. 说明:1字符串s只包含a~z,A~Z,+,-,
    4285. 2.合法的整数包括正整数,一个或者多个0-9组成,如:0,2,3,002,102
    4286. 3.负整数,负号开头,数字部分由一个或者多个0-9组成,如-2,-012,-23,-00023
    4287. 输入描述:包含数字的字符串
    4288. 输出描述:所有整数的最小和
    4289. 示例:
    4290. 输入:
    4291. bb1234aa
    4292.  输出
    4293. 10
    4294.  输入:
    4295. bb12-34aa
    4296.  输出:
    4297. -31
    4298. 说明:1+2-(34)=-31
    4299. */
    4300. function main(line) {
    4301. let chars = line.split('');
    4302. let sum = 0;
    4303. for (let i = 0; i < chars.length; i++) {
    4304. let c = chars[i];
    4305. if (c == '-') {
    4306. i++;
    4307. let start = i;
    4308. while (i < chars.length && !isNaN(chars[i])) {
    4309. i++;
    4310. }
    4311. let substring = line.substring(start, i);
    4312. if (substring.length > 0) {
    4313. sum -= Number(substring);
    4314. }
    4315. i--;
    4316. continue;
    4317. }
    4318. if (!isNaN(c)) {
    4319. sum += Number(c);
    4320. }
    4321. }
    4322. console.log(sum);
    4323. }
    4324. main("bb1234aa")
    4325. main("bb12-34aa")
    4326. // 084 95%
    4327. /*
    4328. 小组中每位都有一张卡片
    4329. 卡片是6位以内的正整数
    4330. 将卡片连起来可以组成多种数字
    4331. 计算组成的最大数字
    4332. 输入描述:
    4333. ","分割的多个正整数字符串
    4334. 不需要考虑非数字异常情况
    4335. 小组种最多25个人
    4336. 输出描述:
    4337. 最大数字字符串
    4338. 示例一
    4339. 输入
    4340. 22,221
    4341. 输出
    4342. 22221
    4343. 示例二
    4344. 输入
    4345. 4589,101,41425,9999
    4346. 输出
    4347. 9999458941425101
    4348. */
    4349. function main(nums) {
    4350. let builder = nums.split(",")
    4351. .sort((s1, s2) => {
    4352. let v1 = s1.split("");
    4353. let v2 = s2.split("");
    4354. let len1 = v1.length;
    4355. let len2 = v2.length;
    4356. if (len1 == len2) {
    4357. return s2-(s1);
    4358. }
    4359. let min = Math.min(len1, len2);
    4360. for (let i = 0; i < min; i++) {
    4361. let c1 = v1[i];
    4362. let c2 = v2[i];
    4363. if (c1 != c2) {
    4364. return c2 - c1;
    4365. }
    4366. }
    4367. if (len1 > len2) {
    4368. return v1[0] - v1[min];
    4369. } else {
    4370. return v2[min] - v2[0];
    4371. }
    4372. })
    4373. console.log(builder.join(''));
    4374. }
    4375. main("4589,101,41425,9999");
    4376. main("22,221");
    4377. // 085 95%
    4378. /*
    4379. 有一个特殊的五键键盘
    4380. 上面有A、Ctrl-C、Ctrl-X、Ctrl-V、Ctrl-A
    4381. A键在屏幕上输出一个字母A
    4382. Ctrl-C将当前所选的字母复制到剪贴板
    4383. Ctrl-X将当前选择的字母复制到剪贴板并清空所选择的字母
    4384. Ctrl-V将当前剪贴板的字母输出到屏幕
    4385. Ctrl-A选择当前屏幕中所有字母
    4386. 注意:
    4387. 1. 剪贴板初始为空
    4388. 2. 新的内容复制到剪贴板会覆盖原有内容
    4389. 3. 当屏幕中没有字母时,Ctrl-A无效
    4390. 4. 当没有选择字母时Ctrl-C、Ctrl-X无效
    4391. 5. 当有字母被选择时A和Ctrl-V这两个输出功能的键,
    4392. 会先清空所选的字母再进行输出
    4393. 给定一系列键盘输入,
    4394. 输出最终屏幕上字母的数量
    4395. 输入描述:
    4396. 输入为一行
    4397. 为简化解析用数字12345分别代替A、Ctrl-C、Ctrl-X、Ctrl-V、Ctrl-A的输入
    4398. 数字用空格分割
    4399. 输出描述:
    4400. 输出一个数字为屏幕上字母的总数量
    4401. 示例一:
    4402. 输入:
    4403. 1 1 1
    4404. 输出:
    4405. 3
    4406. 示例二:
    4407. 输入:
    4408. 1 1 5 1 5 2 4 4
    4409. 输出:
    4410. 2
    4411. */
    4412. function main(let args) {
    4413. Scanner in = new Scanner(System.in);
    4414. let ops = in .nextLine(); in .close();
    4415. let list = ops.split(" ");
    4416. let builder = new
    4417. let ();
    4418. let choose = "";
    4419. let tab = "";
    4420. for (let op: list) {
    4421. switch (op) {
    4422. case "1":
    4423. choose = reset(builder, choose);
    4424. builder.append('A');
    4425. break;
    4426. case "2":
    4427. if (!choose.isEmpty()) {
    4428. tab = choose;
    4429. }
    4430. break;
    4431. case "3":
    4432. if (!choose.isEmpty()) {
    4433. tab = choose;
    4434. choose = "";
    4435. builder = new
    4436. let ();
    4437. }
    4438. break;
    4439. case "4":
    4440. choose = reset(builder, choose);
    4441. builder.append(tab);
    4442. break;
    4443. case "5":
    4444. if (builder.length() != 0) {
    4445. choose = builder.toString();
    4446. }
    4447. break;
    4448. default:
    4449. break;
    4450. }
    4451. console.log(builder);
    4452. console.log(builder.length());
    4453. }
    4454. console.log(builder.length());
    4455. }
    4456. function reset(let builder,
    4457. let choose) {
    4458. if (!choose.isEmpty()) {
    4459. builder.replace(0, choose.length(), "");
    4460. choose = "";
    4461. }
    4462. return choose;
    4463. }
    4464. // 086 100%
    4465. /*
    4466. 给定一个射击比赛成绩单
    4467. 包含多个选手若干次射击的成绩分数
    4468. 请对每个选手按其最高三个分数之和进行降序排名
    4469. 输出降序排名后的选手id序列
    4470. 条件如下
    4471. 1. 一个选手可以有多个射击成绩的分数,且次序不固定
    4472. 2. 如果一个选手成绩少于3个,则认为选手的所有成绩无效,排名忽略该选手
    4473. 3. 如果选手的成绩之和相等,则相等的选手按照其id降序排列
    4474. 输入描述:
    4475. 输入第一行
    4476. 一个整数N
    4477. 表示该场比赛总共进行了N次射击
    4478. 产生N个成绩分数
    4479. 2<=N<=100
    4480. 输入第二行
    4481. 一个长度为N整数序列
    4482. 表示参与每次射击的选手id
    4483. 0<=id<=99
    4484. 输入第三行
    4485. 一个长度为N整数序列
    4486. 表示参与每次射击选手对应的成绩
    4487. 0<=成绩<=100
    4488. 输出描述:
    4489. 符合题设条件的降序排名后的选手ID序列
    4490. 示例一
    4491. 输入:
    4492. 13
    4493. 3,3,7,4,4,4,4,7,7,3,5,5,5
    4494. 53,80,68,24,39,76,66,16,100,55,53,80,55
    4495. 输出:
    4496. 5,3,7,4
    4497. 说明:
    4498. 该场射击比赛进行了13次
    4499. 参赛的选手为{3,4,5,7}
    4500. 3号选手成绩53,80,55 最高三个成绩的和为188
    4501. 4号选手成绩24,39,76,66 最高三个成绩的和为181
    4502. 5号选手成绩53,80,55 最高三个成绩的和为188
    4503. 7号选手成绩68,16,100 最高三个成绩的和为184
    4504. 比较各个选手最高3个成绩的和
    4505. 有3号=5号>7号>4号
    4506. 由于3号和5号成绩相等 且id 5>3
    4507. 所以输出5,3,7,4
    4508. */
    4509. function main(args) {
    4510. let n = Number( in .nextLine());
    4511. let ids = toIntList( in .nextLine());
    4512. let scores = toIntList( in .nextLine());
    4513. let map = new Map();
    4514. for (let i = 0; i < n; i++) {
    4515. Integer id = ids.get(i);
    4516. Integer score = scores.get(i);
    4517. let list = map.getOrDefault(id, []);
    4518. list.add(score);
    4519. map.put(id, list);
    4520. }
    4521. let builder = new
    4522. let ();
    4523. map.entrySet()
    4524. .stream()
    4525. .filter(x - > x.getValue().size() >= 3)
    4526. .sorted((o1, o2) - > {
    4527. Integer sum1 = sumT3(o1.getValue());
    4528. Integer sum2 = sumT3(o2.getValue());
    4529. if (sum1.equals(sum2)) {
    4530. return o2.getKey() - o1.getKey();
    4531. } else {
    4532. return sum2 - sum1;
    4533. }
    4534. })
    4535. .map(Map.Entry::getKey)
    4536. .forEach(x - > builder.append(x).append(","));
    4537. console.log(builder.substring(0, builder.length() - 1));
    4538. }
    4539. function sumT3(let list) {
    4540. list.sort(Integer::compareTo);
    4541. let sum = 0;
    4542. for (let i = list.size() - 1; i >= list.size() - 3; i--) {
    4543. sum += list.get(i);
    4544. }
    4545. return sum;
    4546. }
    4547. function toIntList(let str) {
    4548. return Arrays.stream(str.split(","))
    4549. .map(Integer::parseInt)
    4550. .collect(Collectors.toList());
    4551. }