当前位置:   article > 正文

牛客华为题库前40题_while(cin>>s); cout<

while(cin>>s); cout<
  1. /*作者:jennie
  2. * 开始时间:2022年08月30日 00:49:29 星期二
  3. * 结束时间:2022年08月30日 00:52:56 星期二 (3)
  4. * 课程名:华为题库
  5. * 知识单元:HJ1 字符串最后一个单词的长度
  6. * 属性:HJ1 字符串最后一个单词的长度
  7. * 具体题目要求:
  8. * 描述
  9. 计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不以空格为结尾)
  10. 输入描述:
  11. 输入一行,代表要计算的字符串,非空,长度小于5000。
  12. 输出描述:
  13. 输出一个整数,表示输入字符串最后一个单词的长度。
  14. 示例1
  15. 输入:
  16. hello nowcoder
  17. 复制
  18. 输出:
  19. 8
  20. 复制
  21. 说明:
  22. 最后一个单词为nowcoder,长度为8
  23. */
  24. #include<bits/stdc++.h>
  25. using namespace std;
  26. int main1() {
  27. string s;
  28. while (cin >> s);
  29. cout << s.size();
  30. return 0;
  31. }
  32. /*2022年08月30日 00:52:50 星期二
  33. * 2022年08月30日 00:57:23 星期二 (5)
  34. HJ2 计算某字符出现次数
  35. 题目
  36. 题解(824)
  37. 讨论(2k)
  38. 排行
  39. 面经new
  40. 简单 通过率:33.63% 时间限制:1秒 空间限制:32M
  41. 知识点
  42. 字符串
  43. 哈希
  44. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  45. 描述
  46. 写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字符,然后输出输入字符串中该字符的出现次数。(不区分大小写字母)
  47. 数据范围: 1 \le n \le 1000 \1≤n≤1000
  48. 输入描述:
  49. 第一行输入一个由字母和数字以及空格组成的字符串,第二行输入一个字符。
  50. 输出描述:
  51. 输出输入字符串中含有该字符的个数。(不区分大小写字母)
  52. 示例1
  53. 输入:
  54. ABCabc
  55. A
  56. 复制
  57. 输出:
  58. 2
  59. 复制*/
  60. int main2() {
  61. string s;
  62. getline(cin, s);
  63. char ch;
  64. int res = 0;
  65. cin >> ch;
  66. for (auto c : s) {
  67. if (tolower(c) == ch || toupper(c) == ch) {
  68. res++;
  69. }
  70. }
  71. cout << res;
  72. return 0;
  73. }
  74. /*HJ3 明明的随机数
  75. 题目
  76. 题解(824)
  77. 讨论(2k)
  78. 排行
  79. 面经new
  80. 较难 通过率:24.98% 时间限制:1秒 空间限制:32M
  81. 知识点
  82. 数组
  83. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  84. 描述
  85. 明明生成了NN个1到500之间的随机整数。请你删去其中重复的数字,即相同的数字只保留一个,把其余相同的数去掉,然后再把这些数从小到大排序,按照排好的顺序输出。
  86. 数据范围: 1 \le n \le 1000 \1≤n≤1000 ,输入的数字大小满足 1 \le val \le 500 \1≤val≤500
  87. 输入描述:
  88. 第一行先输入随机整数的个数 N 。 接下来的 N 行每行输入一个整数,代表明明生成的随机数。 具体格式可以参考下面的"示例"。
  89. 输出描述:
  90. 输出多行,表示输入数据处理后的结果
  91. 示例1
  92. 输入:
  93. 3
  94. 2
  95. 2
  96. 1
  97. 复制
  98. 输出:
  99. 1
  100. 2
  101. 复制
  102. 说明:
  103. 输入解释:
  104. 第一个数字是3,也即这个小样例的N=3,说明用计算机生成了3个1到500之间的随机整数,接下来每行一个随机数字,共3行,也即这3个随机数字为:
  105. 2
  106. 2
  107. 1
  108. 所以样例的输出为:
  109. 1
  110. 2
  111. 2022年08月30日 00:57:58 星期二
  112. 2022年08月30日 01:02:31 星期二 (5)*/
  113. int main3() {
  114. int n,num;
  115. set<int> s0;
  116. vector<int> v0;
  117. cin >> n;
  118. while (n--)
  119. {
  120. cin >> num;
  121. s0.insert(num);
  122. }
  123. for (auto it : s0) {
  124. cout << it << endl;
  125. }
  126. return 0;
  127. }
  128. /*HJ4 字符串分隔
  129. 题目
  130. 题解(904)
  131. 讨论(1k)
  132. 排行
  133. 面经new
  134. 简单 通过率:31.27% 时间限制:1秒 空间限制:32M
  135. 知识点
  136. 字符串
  137. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  138. 描述
  139. •输入一个字符串,请按长度为8拆分每个输入字符串并进行输出;
  140. •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
  141. 输入描述:
  142. 连续输入字符串(每个字符串长度小于等于100)
  143. 输出描述:
  144. 依次输出所有分割后的长度为8的新字符串
  145. 示例1
  146. 输入:
  147. abc
  148. 复制
  149. 输出:
  150. abc00000
  151. 复制
  152. 2022年08月30日 01:02:58 星期二
  153. 2022年08月30日 01:14:06 星期二 (12)*/
  154. int main4() {
  155. string s;
  156. getline(cin, s);
  157. int i=0,n=8-s.size() % 8;
  158. s.append(n%8, '0');
  159. while (i < s.size()) {
  160. cout << s.substr(i, 8)<<endl;
  161. i += 8;
  162. }
  163. return 0;
  164. }
  165. /*HJ5 进制转换
  166. 题目
  167. 题解(597)
  168. 讨论(1k)
  169. 排行
  170. 面经new
  171. 简单 通过率:37.25% 时间限制:1秒 空间限制:32M
  172. 知识点
  173. 字符串
  174. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  175. 描述
  176. 写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。
  177. 数据范围:保证结果在 1 \le n \le 2^{31}-1 \1≤n≤2
  178. 31
  179. −1
  180. 输入描述:
  181. 输入一个十六进制的数值字符串。
  182. 输出描述:
  183. 输出该数值的十进制字符串。不同组的测试用例用\n隔开。
  184. 示例1
  185. 输入:
  186. 0xAA
  187. 复制
  188. 输出:
  189. 170
  190. 复制
  191. 2022年08月30日 01:14:42 星期二 */
  192. int main5() {
  193. string s;
  194. cin >> s;
  195. //int n = 0;
  196. //for (int i = 2; i < s.size(); i++) {
  197. // n *= 16;
  198. // if (isdigit(s[i])) {
  199. // n += (s[i] - '0'); //数字
  200. // }
  201. // else {
  202. // n+=(s[i] - 'A'+10);
  203. // }
  204. //}
  205. //cout << n;
  206. cout << stoi(s, 0, 16);
  207. return 0;
  208. }
  209. /*
  210. HJ6 质数因子
  211. 题目
  212. 题解(564)
  213. 讨论(1k)
  214. 排行
  215. 面经new
  216. 简单 通过率:28.18% 时间限制:1秒 空间限制:32M
  217. 知识点
  218. 排序
  219. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  220. 描述
  221. 功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180的质因子为2 2 3 3 5 )
  222. 数据范围: 1 \le n \le 2 \times 10^{9} + 14 \1≤n≤2×10
  223. 9
  224. +14
  225. 输入描述:
  226. 输入一个整数
  227. 输出描述:
  228. 按照从小到大的顺序输出它的所有质数的因子,以空格隔开。
  229. 示例1
  230. 输入:
  231. 180
  232. 复制
  233. 输出:
  234. 2 2 3 3 5
  235. 复制
  236. 相似企业真题
  237. TOP
  238. 2022年08月30日 13:50:38 星期二
  239. 2022年08月30日 14:00:40 星期二 (10)*/
  240. //bool judge(int n) { //不用判断质数
  241. // for (int i = 2; i <= sqrt(n); i++) {
  242. // if (!(n % i)) {
  243. // return false;
  244. // }
  245. // }
  246. // return true;
  247. //}
  248. int main6() {
  249. int n;
  250. cin >> n;
  251. for (int i = 2; i <= sqrt(n); i++) { //不用判断质数,为了有限时间注意i<=sqrt(n),绝妙想法
  252. while (!(n % i)) {
  253. cout << i << ' ';
  254. n /= i;
  255. }
  256. }
  257. return 0;
  258. }
  259. /*
  260. HJ7 取近似值
  261. 题目
  262. 题解(467)
  263. 讨论(1k)
  264. 排行
  265. 面经new
  266. 入门 通过率:53.27% 时间限制:1秒 空间限制:32M
  267. 知识点
  268. 基础数学
  269. 语法题
  270. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  271. 描述
  272. 写出一个程序,接受一个正浮点数值,输出该数值的近似整数值。如果小数点后数值大于等于 0.5 ,向上取整;小于 0.5 ,则向下取整。
  273. 数据范围:保证输入的数字在 32 位浮点数范围内
  274. 输入描述:
  275. 输入一个正浮点数值
  276. 输出描述:
  277. 输出该数值的近似整数值
  278. 示例1
  279. 输入:
  280. 5.5
  281. 复制
  282. 输出:
  283. 6
  284. 复制
  285. 说明:
  286. 0.5>=0.5,所以5.5需要向上取整为6
  287. 示例2
  288. 输入:
  289. 2.499
  290. 复制
  291. 输出:
  292. 2
  293. 复制
  294. 说明:
  295. 0.499<0.5,2.499向下取整为2
  296. 相似企业真题
  297. TOP
  298. 2022年08月30日 14:03:12 星期二 */
  299. int main7() {
  300. double n;
  301. cin >> n;
  302. cout << int(n + 0.5);
  303. return 0;
  304. }
  305. /*
  306. HJ8 合并表记录
  307. 题目
  308. 题解(554)
  309. 讨论(1k)
  310. 排行
  311. 面经new
  312. 简单 通过率:37.57% 时间限制:1秒 空间限制:32M
  313. 知识点
  314. 哈希
  315. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  316. 描述
  317. 数据表记录包含表索引index和数值value(int范围的正整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照index值升序进行输出。
  318. 提示:
  319. 0 <= index <= 11111111
  320. 1 <= value <= 100000
  321. 输入描述:
  322. 先输入键值对的个数n(1 <= n <= 500)
  323. 接下来n行每行输入成对的index和value值,以空格隔开
  324. 输出描述:
  325. 输出合并后的键值对(多行)
  326. 示例1
  327. 输入:
  328. 4
  329. 0 1
  330. 0 2
  331. 1 2
  332. 3 4
  333. 复制
  334. 输出:
  335. 0 3
  336. 1 2
  337. 3 4
  338. 复制
  339. 示例2
  340. 输入:
  341. 3
  342. 0 1
  343. 0 2
  344. 8 9
  345. 复制
  346. 输出:
  347. 0 3
  348. 8 9
  349. 复制
  350. 相似企业真题
  351. TOP
  352. 2022年08月30日 14:32:26 星期二
  353. 2022年08月30日 14:38:48 星期二 (6)
  354. */
  355. int main8() {
  356. int i, n, v;
  357. map<int, int> m;
  358. cin >> n;
  359. while (n--) {
  360. cin >> i >> v;
  361. m[i] += v;
  362. }
  363. for (auto it : m) {
  364. cout << it.first << ' ' << it.second << endl;
  365. }
  366. return 0;
  367. }
  368. /*
  369. HJ9 提取不重复的整数
  370. 题目
  371. 题解(656)
  372. 讨论(1k)
  373. 排行
  374. 面经new
  375. 入门 通过率:48.70% 时间限制:1秒 空间限制:32M
  376. 知识点
  377. 数组
  378. 哈希
  379. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  380. 描述
  381. 输入一个 int 型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。
  382. 保证输入的整数最后一位不是 0 。
  383. 数据范围: 1 \le n \le 10^{8} \1≤n≤10
  384. 8
  385. 输入描述:
  386. 输入一个int型整数
  387. 输出描述:
  388. 按照从右向左的阅读顺序,返回一个不含重复数字的新的整数
  389. 示例1
  390. 输入:
  391. 9876673
  392. 复制
  393. 输出:
  394. 37689
  395. 复制
  396. 相似企业真题
  397. TOP
  398. 2022年08月30日 14:39:06 星期二
  399. 2022年08月30日 14:43:08 星期二(4) */
  400. int main9() {
  401. string s;
  402. cin >> s;
  403. set<int> s0;
  404. int len = 0;
  405. for (int i = s.size()-1; i >= 0; i--) {
  406. s0.insert(s[i]);
  407. if (s0.size() > len) {
  408. cout << s[i];
  409. len++;
  410. }
  411. }
  412. return 0;
  413. }
  414. /*
  415. HJ10 字符个数统计
  416. 题目
  417. 题解(544)
  418. 讨论(1k)
  419. 排行
  420. 面经new
  421. 简单 通过率:52.23% 时间限制:1秒 空间限制:32M
  422. 知识点
  423. 字符串
  424. 哈希
  425. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  426. 描述
  427. 编写一个函数,计算字符串中含有的不同字符的个数。字符在 ASCII 码范围内( 0~127 ,包括 0 和 127 ),换行表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次
  428. 例如,对于字符串 abaca 而言,有 a、b、c 三种不同的字符,因此输出 3 。
  429. 数据范围: 1 \le n \le 500 \1≤n≤500
  430. 输入描述:
  431. 输入一行没有空格的字符串。
  432. 输出描述:
  433. 输出 输入字符串 中范围在(0~127,包括0和127)字符的种数。
  434. 示例1
  435. 输入:
  436. abc
  437. 复制
  438. 输出:
  439. 3
  440. 复制
  441. 示例2
  442. 输入:
  443. aaa
  444. 复制
  445. 输出:
  446. 1
  447. 复制
  448. 相似企业真题
  449. TOP
  450. 2022年08月30日 14:45:39 星期二
  451. 2022年08月30日 14:47:46 星期二 (2)*/
  452. int main10() {
  453. set<int> s0;
  454. string s;
  455. cin >> s;
  456. for (auto c : s) {
  457. s0.insert(c);
  458. }
  459. cout << s0.size();
  460. return 0;
  461. }
  462. /*
  463. HJ11 数字颠倒
  464. 题目
  465. 题解(387)
  466. 讨论(1k)
  467. 排行
  468. 面经new
  469. 简单 通过率:61.80% 时间限制:1秒 空间限制:32M
  470. 知识点
  471. 字符串
  472. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  473. 描述
  474. 输入一个整数,将这个整数以字符串的形式逆序输出
  475. 程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001
  476. 数据范围: 0 \le n \le 2^{30}-1 \0≤n≤2
  477. 30
  478. −1
  479. 输入描述:
  480. 输入一个int整数
  481. 输出描述:
  482. 将这个整数以字符串的形式逆序输出
  483. 示例1
  484. 输入:
  485. 1516000
  486. 复制
  487. 输出:
  488. 0006151
  489. 复制
  490. 示例2
  491. 输入:
  492. 0
  493. 复制
  494. 输出:
  495. 0
  496. 复制
  497. 相似企业真题
  498. TOP
  499. 2022年08月30日 14:48:04 星期二
  500. 2022年08月30日 14:49:50 星期二 (1)*/
  501. int main1112() {
  502. string s;
  503. cin >> s;
  504. reverse(s.begin(), s.end());
  505. cout << s;
  506. return 0;
  507. }
  508. /*
  509. HJ13 句子逆序
  510. 题目
  511. 题解(426)
  512. 讨论(1k)
  513. 排行
  514. 面经new
  515. 简单 通过率:44.31% 时间限制:1秒 空间限制:32M
  516. 知识点
  517. 数组
  518. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  519. 描述
  520. 将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I”
  521. 所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符
  522. 数据范围:输入的字符串长度满足 1 \le n \le 1000 \1≤n≤1000
  523. 注意本题有多组输入
  524. 输入描述:
  525. 输入一个英文语句,每个单词用空格隔开。保证输入只包含空格和字母。
  526. 输出描述:
  527. 得到逆序的句子
  528. 示例1
  529. 输入:
  530. I am a boy
  531. 复制
  532. 输出:
  533. boy a am I
  534. 复制
  535. 示例2
  536. 输入:
  537. nowcoder
  538. 复制
  539. 输出:
  540. nowcoder
  541. 复制
  542. 相似企业真题
  543. TOP
  544. 2022年08月30日 14:50:13 星期二
  545. 2022年08月30日 14:52:44 星期二(2) */
  546. int main13() {
  547. vector<string> v;
  548. string s;
  549. while (cin>>s)
  550. {
  551. v.push_back(s);
  552. }
  553. for (int i = v.size() - 1; i >= 0; i--) {
  554. cout << v[i] << ' ';
  555. }
  556. return 0;
  557. }
  558. /*
  559. HJ14 字符串排序
  560. 题目
  561. 题解(411)
  562. 讨论(1k)
  563. 排行
  564. 面经new
  565. 简单 通过率:45.57% 时间限制:1秒 空间限制:32M
  566. 知识点
  567. 字符串
  568. 排序
  569. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  570. 描述
  571. 给定 n 个字符串,请对 n 个字符串按照字典序排列。
  572. 数据范围: 1 \le n \le 1000 \1≤n≤1000 ,字符串长度满足 1 \le len \le 100 \1≤len≤100
  573. 输入描述:
  574. 输入第一行为一个正整数n(1≤n≤1000),下面n行为n个字符串(字符串长度≤100),字符串中只含有大小写字母。
  575. 输出描述:
  576. 数据输出n行,输出结果为按照字典序排列的字符串。
  577. 示例1
  578. 输入:
  579. 9
  580. cap
  581. to
  582. cat
  583. card
  584. two
  585. too
  586. up
  587. boat
  588. boot
  589. 复制
  590. 输出:
  591. boat
  592. boot
  593. cap
  594. card
  595. cat
  596. to
  597. too
  598. two
  599. up
  600. 复制
  601. 相似企业真题
  602. TOP
  603. 2022年08月30日 14:54:02 星期二
  604. 2022年08月30日 14:56:00 星期二(2) */
  605. int main14() {
  606. int n;
  607. cin >> n;
  608. string* arr = new string[n];
  609. for (int i = 0; i < n; i++) {
  610. cin >> arr[i];
  611. }
  612. sort(arr, arr + n);
  613. for (int i = 0; i < n; i++) {
  614. cout<< arr[i]<<endl;
  615. }
  616. return 0;
  617. }
  618. /*
  619. HJ15 求int型正整数在内存中存储时1的个数
  620. 题目
  621. 题解(465)
  622. 讨论(1k)
  623. 排行
  624. 面经new
  625. 简单 通过率:60.65% 时间限制:1秒 空间限制:32M
  626. 知识点
  627. 位运算
  628. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  629. 描述
  630. 输入一个 int 型的正整数,计算出该 int 型数据在内存中存储时 1 的个数。
  631. 数据范围:保证在 32 位整型数字范围内
  632. 输入描述:
  633. 输入一个整数(int类型)
  634. 输出描述:
  635. 这个数转换成2进制后,输出1的个数
  636. 示例1
  637. 输入:
  638. 5
  639. 复制
  640. 输出:
  641. 2
  642. 复制
  643. 示例2
  644. 输入:
  645. 0
  646. 复制
  647. 输出:
  648. 0
  649. 复制
  650. TOP
  651. 2022年08月30日 14:57:03 星期二
  652. 2022年08月30日 14:58:36 星期二 (1)*/
  653. int main15() {
  654. int n;
  655. cin >> n;
  656. bitset<32> b(n); //记住32
  657. cout << b.count();
  658. return 0;
  659. }
  660. /*0-1背包问题
  661. 问题描述:有一个背包可以装物品的总重量为W,现有N个物品,
  662. 每个物品中w[i],价值v[i],用背包装物品,能装的最大价值是多少?*/
  663. //dp[i][j],前i个个在限重j最大价值,0(WN),从左到右,从上到下
  664. //对每个物品只有两种状态,放入和不放入,对应得出状态方程如下
  665. //dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]) 正上方和斜左上
  666. //目标是获得dp[N][W]
  667. //dp[0][0]=0
  668. int main01() {
  669. int W = 10,n=5,w[6]={0,5,1,7,6,3},v[6]={0,5,2,6,8,4};
  670. int dp[6][11] = { 0 };
  671. for (int i = 1; i <= n; i++) {
  672. for (int j = 1; j <= W; j++) {
  673. if (j - w[i] >= 0) {
  674. dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]]+v[i]);
  675. }
  676. else {
  677. dp[i][j] = dp[i - 1][j];
  678. }
  679. }
  680. }
  681. for (int i = 1; i <= n; i++) {
  682. for (int j = 1; j <= W; j++) {
  683. cout << dp[i][j] << ' ';
  684. }
  685. cout << endl;
  686. }
  687. cout << dp[n][W];
  688. return 0;
  689. }
  690. /*
  691. HJ16 购物单
  692. 题目
  693. 题解(196)
  694. 讨论(532)
  695. 排行
  696. 面经new
  697. 中等 通过率:23.51% 时间限制:1秒 空间限制:32M
  698. 知识点
  699. 动态规划
  700. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  701. 描述
  702. 王强决定把年终奖用于购物,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:
  703. 主件 附件
  704. 电脑 打印机,扫描仪
  705. 书柜 图书
  706. 书桌 台灯,文具
  707. 工作椅 无
  708. 如果要买归类为附件的物品,必须先买该附件所属的主件,且每件物品只能购买一次。
  709. 每个主件可以有 0 个、 1 个或 2 个附件。附件不再有从属于自己的附件。
  710. 王强查到了每件物品的价格(都是 10 元的整数倍),而他只有 N 元的预算。除此之外,他给每件物品规定了一个重要度,用整数 1 ~ 5 表示。他希望在花费不超过 N 元的前提下,使自己的满意度达到最大。
  711. 满意度是指所购买的每件物品的价格与重要度的乘积的总和,假设设第ii件物品的价格为v[i]v[i],重要度为w[i]w[i],共选中了kk件物品,编号依次为j_1,j_2,...,j_kj
  712. 1
  713. ,j
  714. 2
  715. ,...,j
  716. k
  717. ,则满意度为:v[j_1]*w[j_1]+v[j_2]*w[j_2]+ … +v[j_k]*w[j_k]v[j
  718. 1
  719. ]∗w[j
  720. 1
  721. ]+v[j
  722. 2
  723. ]∗w[j
  724. 2
  725. ]+…+v[j
  726. k
  727. ]∗w[j
  728. k
  729. ]。(其中 * 为乘号)
  730. 请你帮助王强计算可获得的最大的满意度。
  731. 输入描述:
  732. 输入的第 1 行,为两个正整数N,m,用一个空格隔开:
  733. (其中 N ( N<32000 )表示总钱数, m (m <60 )为可购买的物品的个数。)
  734. 从第 2 行到第 m+1 行,第 j 行给出了编号为 j-1 的物品的基本数据,每行有 3 个非负整数 v p q
  735. (其中 v 表示该物品的价格( v<10000 ), p 表示该物品的重要度( 1 ~ 5 ), q 表示该物品是主件还是附件。如果 q=0 ,表示该物品为主件,如果 q>0 ,表示该物品为附件, q 是所属主件的编号)
  736. 输出描述:
  737. 输出一个正整数,为张强可以获得的最大的满意度。
  738. 示例1
  739. 输入:
  740. 1000 5
  741. 800 2 0
  742. 400 5 1
  743. 300 5 1
  744. 400 3 0
  745. 500 2 0
  746. 复制
  747. 输出:
  748. 2200
  749. 复制
  750. 示例2
  751. 输入:
  752. 50 5
  753. 20 3 5
  754. 20 3 5
  755. 10 3 0
  756. 10 2 0
  757. 10 1 0
  758. 复制
  759. 输出:
  760. 130
  761. 复制
  762. 说明:
  763. 由第1行可知总钱数N为50以及希望购买的物品个数m为5;
  764. 第2和第3行的q为5,说明它们都是编号为5的物品的附件;
  765. 第4~6行的q都为0,说明它们都是主件,它们的编号依次为3~5;
  766. 所以物品的价格与重要度乘积的总和的最大值为10*1+20*3+20*3=130
  767. 相似企业真题
  768. TOP
  769. */
  770. #include<iostream>
  771. #include<math.h>
  772. using namespace std;
  773. int main16() {
  774. int n, m, a, b, id, res, last = 0;
  775. int flag[65] = { 0 }; //标记主附件情况
  776. cin >> n >> m;
  777. int w[65][4] = { 0 }, v[65][4] = { 0 };
  778. int** dp = new int* [m + 1];
  779. dp[0] = new int[n + 1]{ 0 };
  780. for (int i = 1; i <= m; i++) {
  781. cin >> a >> b >> id;
  782. if (!id) { //主件
  783. flag[i]++;
  784. for (int j = 0; j < 4; j++) {
  785. w[i][j] += a;
  786. v[i][j] += b * a;
  787. }
  788. }
  789. else { //附件
  790. w[id][3] += a;
  791. v[id][3] += b * a;
  792. if (v[id][1] == v[id][0]) {
  793. w[id][1] += a;
  794. v[id][1] += b * a;
  795. flag[id]++;
  796. }
  797. else {
  798. w[id][2] += a;
  799. v[id][2] += b * a;
  800. flag[id] += 2;
  801. }
  802. }
  803. }
  804. for (int i = 1; i <= m; i++) {
  805. dp[i] = new int[n + 1]{ 0 };
  806. if (flag[i]) {
  807. for (int j = 1; j <= n; j++) {
  808. for (int k = 0; k < flag[i]; k++) {
  809. if (j - w[i][k] >= 0) {
  810. dp[i][j] = max(dp[i][j], max(dp[last][j], dp[last][j - w[i][k]] + v[i][k]));
  811. }
  812. else {
  813. dp[i][j] = max(dp[i][j], dp[last][j]);
  814. }
  815. }
  816. res = dp[i][j];
  817. }
  818. last = i;
  819. }
  820. }
  821. cout << res;
  822. return 0;
  823. }
  824. /*
  825. HJ17 坐标移动
  826. 题目
  827. 题解(584)
  828. 讨论(1k)
  829. 排行
  830. 面经new
  831. 中等 通过率:29.54% 时间限制:1秒 空间限制:32M
  832. 知识点
  833. 字符串
  834. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  835. 描述
  836. 开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动。从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面。
  837. 输入:
  838. 合法坐标为A(或者D或者W或者S) + 数字(两位以内)
  839. 坐标之间以;分隔。
  840. 非法坐标点需要进行丢弃。如AA10; A1A; $%$; YAD; 等。
  841. 下面是一个简单的例子 如:
  842. A10;S20;W10;D30;X;A1A;B10A11;;A10;
  843. 处理过程:
  844. 起点(0,0)
  845. + A10 = (-10,0)
  846. + S20 = (-10,-20)
  847. + W10 = (-10,-10)
  848. + D30 = (20,-10)
  849. + x = 无效
  850. + A1A = 无效
  851. + B10A11 = 无效
  852. + 一个空 不影响
  853. + A10 = (10,-10)
  854. 结果 (10, -10)
  855. 数据范围:每组输入的字符串长度满足 1\le n \le 10000 \1≤n≤10000 ,坐标保证满足 -2^{31} \le x,y \le 2^{31}-1 \−2
  856. 31
  857. ≤x,y≤2
  858. 31
  859. −1 ,且数字部分仅含正数
  860. 输入描述:
  861. 一行字符串
  862. 输出描述:
  863. 最终坐标,以逗号分隔
  864. 示例1
  865. 输入:
  866. A10;S20;W10;D30;X;A1A;B10A11;;A10;
  867. 复制
  868. 输出:
  869. 10,-10
  870. 复制
  871. 示例2
  872. 输入:
  873. ABC;AKL;DA1;
  874. 复制
  875. 输出:
  876. 0,0
  877. 复制
  878. 相似企业真题
  879. TOP
  880. 2022年08月30日 17:01:19 星期二
  881. 2022年08月30日 17:34:00 星期二 */
  882. void move(string s, int& x, int& y) {
  883. int step = stoi(s.substr(1));
  884. switch (s[0]) {
  885. case 'A':
  886. x -= step;
  887. return;
  888. case 'D':
  889. x += step;
  890. return;
  891. case 'S':
  892. y -= step;
  893. return;
  894. case 'W':
  895. y += step;
  896. }
  897. }
  898. int main17() {
  899. string s;
  900. int x=0, y=0;
  901. while (getline(cin, s, ';')) {
  902. if (s.size()==2 && isdigit(s[1])||s.size() == 3 && isdigit(s[1]) && isdigit(s[2])) {
  903. move(s, x, y);
  904. }
  905. }
  906. cout << x << ',' << y;
  907. return 0;
  908. }
  909. /*
  910. HJ18 识别有效的IP地址和掩码并进行分类统计
  911. 题目
  912. 题解(196)
  913. 讨论(528)
  914. 排行
  915. 面经new
  916. 较难 通过率:21.24% 时间限制:1秒 空间限制:32M
  917. 知识点
  918. 字符串
  919. 查找
  920. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  921. 描述
  922. 请解析IP地址和对应的掩码,进行分类识别。要求按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类。
  923. 所有的IP地址划分为 A,B,C,D,E五类
  924. A类地址从1.0.0.0到126.255.255.255;
  925. B类地址从128.0.0.0到191.255.255.255;
  926. C类地址从192.0.0.0到223.255.255.255;
  927. D类地址从224.0.0.0到239.255.255.255;
  928. E类地址从240.0.0.0到255.255.255.255
  929. 私网IP范围是:
  930. 从10.0.0.0到10.255.255.255
  931. 从172.16.0.0到172.31.255.255
  932. 从192.168.0.0到192.168.255.255
  933. 子网掩码为二进制下前面是连续的1,然后全是0。(例如:255.255.255.32就是一个非法的掩码)
  934. (注意二进制下全是1或者全是0均为非法子网掩码)
  935. 注意:
  936. 1. 类似于【0.*.*.*】和【127.*.*.*】的IP地址不属于上述输入的任意一类,也不属于不合法ip地址,计数时请忽略
  937. 2. 私有IP地址和A,B,C,D,E类地址是不冲突的
  938. 输入描述:
  939. 多行字符串。每行一个IP地址和掩码,用~隔开。
  940. 请参考帖子https://www.nowcoder.com/discuss/276处理循环输入的问题。
  941. 输出描述:
  942. 统计A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数,之间以空格隔开。
  943. 示例1
  944. 输入:
  945. 10.70.44.68~255.254.255.0
  946. 1.0.0.1~255.0.0.0
  947. 192.168.0.2~255.255.255.0
  948. 19..0.~255.255.255.0
  949. 复制
  950. 输出:
  951. 1 0 1 0 0 2 1
  952. 复制
  953. 说明:
  954. 10.70.44.68~255.254.255.0的子网掩码非法,19..0.~255.255.255.0的IP地址非法,所以错误IP地址或错误掩码的计数为2;
  955. 1.0.0.1~255.0.0.0是无误的A类地址;
  956. 192.168.0.2~255.255.255.0是无误的C类地址且是私有IP;
  957. 所以最终的结果为1 0 1 0 0 2 1
  958. 示例2
  959. 输入:
  960. 0.201.56.50~255.255.111.255
  961. 127.201.56.50~255.255.111.255
  962. 复制
  963. 输出:
  964. 0 0 0 0 0 0 0
  965. 复制
  966. 说明:
  967. 类似于【0.*.*.*】和【127.*.*.*】的IP地址不属于上述输入的任意一类,也不属于不合法ip地址,计数时请忽略
  968. 相似企业真题
  969. TOP
  970. 2022年08月30日 17:35:20 星期二
  971. 2022年08月30日 18:00:48 星期二
  972. 2022年08月30日 19:23:48 星期二
  973. 2022年08月30日 20:30:12 星期二 (78浪费时间)*/
  974. void judgeip(int ip[4], int& a, int& b, int& c, int& d, int& e, int& p) {
  975. if (ip[0] > 0 && ip[0] < 127) {
  976. a++;
  977. if (ip[0] == 10) {
  978. p++;
  979. }
  980. }else if (ip[0] > 127 && ip[0] < 192) {
  981. b++;
  982. if (ip[0] == 172&&ip[1]>=16&&ip[1]<32) {
  983. p++;
  984. }
  985. }
  986. else if (ip[0] >= 192 && ip[0] < 224) {
  987. c++;
  988. if (ip[0] == 192 && ip[1]==168) {
  989. p++;
  990. }
  991. }
  992. else if (ip[0] >= 224 && ip[0] < 240) {
  993. d++;
  994. }
  995. else if (ip[0] >= 240 && ip[0] < 256) {
  996. e++;
  997. }
  998. }
  999. int main18() {
  1000. string s; //一个个数字读入,每次循环里会读8次s
  1001. bool flag1, flag2,flag3; //标记当下行ip和mask是否正确,以及mask的变号
  1002. int a=0, b=0, c=0, d=0, e=0, r=0, p=0,ip[4],mask[4];
  1003. while (getline(cin, s, '.')) { //为了区别循环结束,第一个数单独读
  1004. if (s =="0" || s == "127") {
  1005. //类似于【0.*.*.*】和【127.*.*.*】的IP地址不属于上述输入的任意一类,也不属于不合法ip地址,计数时请忽略
  1006. getline(cin, s);
  1007. continue;
  1008. }
  1009. flag1 = true,flag2 = true,flag3=true;
  1010. for (int i = 0; i < 4; i++) { //读ip并判断是否合法
  1011. if (i==3) { //ip第4个数~结尾
  1012. getline(cin, s, '~');
  1013. }
  1014. else if (i) {
  1015. getline(cin, s, '.'); //读第2 3个数
  1016. }
  1017. if (flag1 && (s.empty() || s[0] == '0' && s.size() > 1)) {
  1018. r++; //有误以0开头
  1019. flag1 = false;
  1020. }
  1021. else if (flag1) { //进一步判断数字范围是否合法
  1022. ip[i] = stoi(s);
  1023. if (ip[i] < 0 || ip[i]>255) {
  1024. r++; //有误
  1025. flag1 = false;
  1026. }
  1027. }
  1028. }
  1029. for (int i = 0; i < 4; i++) { //读mask并判断是否合法
  1030. if (i == 3) { //第4个数
  1031. getline(cin, s);
  1032. }
  1033. else{
  1034. getline(cin, s, '.'); //读第2 3个数
  1035. }
  1036. if (flag2 && (s.empty() || s[0] == '0' && s.size() > 1)) {
  1037. r++; //有误以0开头
  1038. flag2 = false;
  1039. }
  1040. else if (flag2) { //进一步判断数字范围是否合法
  1041. mask[i] = stoi(s);
  1042. if (!mask[0]||!flag3 && mask[i]) { //开头为0或末尾0段出现非0有误
  1043. r++; //有误
  1044. flag2 = false;
  1045. }
  1046. else if (flag3 &&mask[i] != 255) { //变号中间段(包括0)
  1047. if (mask[i]>=0&&mask[i]<=255&&(!mask[i]||log2(~mask[i] + 1) == int(log2(~mask[i] + 1)))) {
  1048. flag3 = false; //中间段无误,变号
  1049. }
  1050. else {
  1051. r++; //中间段非法
  1052. flag2 = false;
  1053. }
  1054. }
  1055. else { //开头1段
  1056. if (flag3&&mask[i] != 255) {
  1057. r++; //开头1段非1非法非法
  1058. flag2 = false;
  1059. }
  1060. }
  1061. }
  1062. }
  1063. if (flag3) {
  1064. //r++;
  1065. flag2 = false; //掩码全1
  1066. }else if (flag1&&flag2) { //合法判断ip类型
  1067. judgeip(ip, a, b, c, d, e, p);
  1068. }
  1069. }
  1070. cout << a << ' ' << b << ' ' << c << ' ' << d << ' ' << e << ' ' << r << ' ' << p;
  1071. return 0;
  1072. }
  1073. /*
  1074. HJ19 简单错误记录
  1075. 题目
  1076. 题解(229)
  1077. 讨论(676)
  1078. 排行
  1079. 面经new
  1080. 较难 通过率:23.49% 时间限制:1秒 空间限制:32M
  1081. 知识点
  1082. 字符串
  1083. 哈希
  1084. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  1085. 描述
  1086. 开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。
  1087. 处理:
  1088. 1、 记录最多8条错误记录,循环记录,最后只用输出最后出现的八条错误记录。对相同的错误记录只记录一条,但是错误计数增加。最后一个斜杠后面的带后缀名的部分(保留最后16位)和行号完全匹配的记录才做算是“相同”的错误记录。
  1089. 2、 超过16个字符的文件名称,只记录文件的最后有效16个字符;
  1090. 3、 输入的文件可能带路径,记录文件名称不能带路径。也就是说,哪怕不同路径下的文件,如果它们的名字的后16个字符相同,也被视为相同的错误记录
  1091. 4、循环记录时,只以第一次出现的顺序为准,后面重复的不会更新它的出现时间,仍以第一次为准
  1092. 数据范围:错误记录数量满足 1 \le n \le 100 \1≤n≤100 ,每条记录长度满足 1 \le len \le 100 \1≤len≤100
  1093. 输入描述:
  1094. 每组只包含一个测试用例。一个测试用例包含一行或多行字符串。每行包括带路径文件名称,行号,以空格隔开。
  1095. 输出描述:
  1096. 将所有的记录统计并将结果输出,格式:文件名 代码行数 数目,一个空格隔开,如:
  1097. 示例1
  1098. 输入:
  1099. D:\zwtymj\xccb\ljj\cqzlyaszjvlsjmkwoqijggmybr 645
  1100. E:\je\rzuwnjvnuz 633
  1101. C:\km\tgjwpb\gy\atl 637
  1102. F:\weioj\hadd\connsh\rwyfvzsopsuiqjnr 647
  1103. E:\ns\mfwj\wqkoki\eez 648
  1104. D:\cfmwafhhgeyawnool 649
  1105. E:\czt\opwip\osnll\c 637
  1106. G:\nt\f 633
  1107. F:\fop\ywzqaop 631
  1108. F:\yay\jc\ywzqaop 631
  1109. D:\zwtymj\xccb\ljj\cqzlyaszjvlsjmkwoqijggmybr 645
  1110. 复制
  1111. 输出:
  1112. rzuwnjvnuz 633 1
  1113. atl 637 1
  1114. rwyfvzsopsuiqjnr 647 1
  1115. eez 648 1
  1116. fmwafhhgeyawnool 649 1
  1117. c 637 1
  1118. f 633 1
  1119. ywzqaop 631 2
  1120. 复制
  1121. 说明:
  1122. 由于D:\cfmwafhhgeyawnool 649的文件名长度超过了16个字符,达到了17,所以第一个字符'c'应该被忽略。
  1123. 记录F:\fop\ywzqaop 631和F:\yay\jc\ywzqaop 631由于文件名和行号相同,因此被视为同一个错误记录,哪怕它们的路径是不同的。
  1124. 由于循环记录时,只以第一次出现的顺序为准,后面重复的不会更新它的出现时间,仍以第一次为准,所以D:\zwtymj\xccb\ljj\cqzlyaszjvlsjmkwoqijggmybr 645不会被记录。
  1125. 相似企业真题
  1126. TOP
  1127. 2022年08月30日 20:30:53 星期二
  1128. 2022年08月30日 21:20:25 星期二 (50)*/
  1129. struct file {
  1130. string name;
  1131. int line;
  1132. int n;
  1133. file(string s,int l,int n0):name(s),line(l),n(n0){}
  1134. };
  1135. int main19() {
  1136. vector<file> v;
  1137. string s;
  1138. int l;
  1139. bool flag;
  1140. while (cin>>s>>l)
  1141. {
  1142. flag = true;
  1143. s = s.substr(max(int(s.find_last_of('\\')) + 1,int(s.size()) - 16)); //取文件名,注意原本是unsigned long long,有负数需要2个都类型转换
  1144. for (auto &it : v) {
  1145. if (it.name == s&&it.line==l) {
  1146. it.n++;
  1147. flag = false;
  1148. break;
  1149. }
  1150. }
  1151. if(flag)
  1152. v.push_back(file(s, l, 1));
  1153. }
  1154. for (int i = max(int(v.size()) - 8,0); i < v.size(); i++) {
  1155. cout << v[i].name << ' ' << v[i].line << ' ' << v[i].n << endl;
  1156. }
  1157. return 0;
  1158. }
  1159. /*
  1160. HJ20 密码验证合格程序
  1161. 题目
  1162. 题解(364)
  1163. 讨论(811)
  1164. 排行
  1165. 面经new
  1166. 中等 通过率:33.56% 时间限制:1秒 空间限制:32M
  1167. 知识点
  1168. 字符串
  1169. 数组
  1170. 模拟
  1171. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  1172. 描述
  1173. 密码要求:
  1174. 1.长度超过8位
  1175. 2.包括大小写字母.数字.其它符号,以上四种至少三种
  1176. 3.不能有长度大于2的包含公共元素的子串重复 (注:其他符号不含空格或换行)
  1177. 数据范围:输入的字符串长度满足 1 \le n \le 100 \1≤n≤100
  1178. 输入描述:
  1179. 一组字符串。
  1180. 输出描述:
  1181. 如果符合要求输出:OK,否则输出NG
  1182. 示例1
  1183. 输入:
  1184. 021Abc9000
  1185. 021Abc9Abc1
  1186. 021ABC9000
  1187. 021$bc9000
  1188. 复制
  1189. 输出:
  1190. OK
  1191. NG
  1192. NG
  1193. OK
  1194. 复制
  1195. 相似企业真题
  1196. TOP
  1197. 2022年08月30日 21:22:03 星期二
  1198. 2022年08月30日 21:41:02 星期二 (19)*/
  1199. bool judgepass(string s) {
  1200. if (s.size() < 8) {
  1201. return false;
  1202. }
  1203. bool u=0, l=0, d=0, o=0;
  1204. int n = 0;
  1205. for (auto c : s) {
  1206. if (isupper(c)) {
  1207. if (!u) {
  1208. u = 1;
  1209. n++;
  1210. if (n >= 3) {
  1211. break;
  1212. }
  1213. }
  1214. }else if (islower(c)) {
  1215. if (!l) {
  1216. l = 1;
  1217. n++;
  1218. if (n >= 3) {
  1219. break;
  1220. }
  1221. }
  1222. }
  1223. else if ( isdigit(c)) {
  1224. if (!d) {
  1225. d = 1;
  1226. n++;
  1227. if (n >= 3) {
  1228. break;
  1229. }
  1230. }
  1231. }
  1232. else if (!o) {
  1233. o = 1;
  1234. n++;
  1235. if (n >= 3) {
  1236. break;
  1237. }
  1238. }
  1239. }
  1240. if (n < 3) {
  1241. return false;
  1242. }
  1243. for (int i = 0; i < s.size() - 3; i++) { //子串1起始下标
  1244. if (s.find(s.substr(i,3),i+1) != string::npos) { //注意i+1
  1245. return false; //找到重复子串。
  1246. }
  1247. }
  1248. return true;
  1249. }
  1250. int main20() {
  1251. string s;
  1252. while (cin >> s) {
  1253. if (judgepass(s)) {
  1254. cout << "OK" << endl;
  1255. }
  1256. else {
  1257. cout << "NG" << endl;
  1258. }
  1259. }
  1260. return 0;
  1261. }
  1262. /*
  1263. HJ21 简单密码
  1264. 题目
  1265. 题解(419)
  1266. 讨论(870)
  1267. 排行
  1268. 面经new
  1269. 简单 通过率:44.99% 时间限制:1秒 空间限制:32M
  1270. 知识点
  1271. 字符串
  1272. 模拟
  1273. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  1274. 描述
  1275. 现在有一种密码变换算法。
  1276. 九键手机键盘上的数字与字母的对应: 1--1, abc--2, def--3, ghi--4, jkl--5, mno--6, pqrs--7, tuv--8 wxyz--9, 0--0,把密码中出现的小写字母都变成九键键盘对应的数字,如:a 变成 2,x 变成 9.
  1277. 而密码中出现的大写字母则变成小写之后往后移一位,如:X ,先变成小写,再往后移一位,变成了 y ,例外:Z 往后移是 a 。
  1278. 数字和其它的符号都不做变换。
  1279. 数据范围: 输入的字符串长度满足 1 \le n \le 100 \1≤n≤100
  1280. 输入描述:
  1281. 输入一组密码,长度不超过100个字符。
  1282. 输出描述:
  1283. 输出密码变换后的字符串
  1284. 示例1
  1285. 输入:
  1286. YUANzhi1987
  1287. 复制
  1288. 输出:
  1289. zvbo9441987
  1290. 复制
  1291. 相似企业真题
  1292. TOP
  1293. 2022年08月30日 21:41:22 星期二
  1294. 2022年08月30日 21:52:08 星期二 (11)*/
  1295. int main21() {
  1296. string s;
  1297. cin >> s;
  1298. for (auto& c : s) {
  1299. if (islower(c)) {
  1300. if (c == 'z') {
  1301. c = '9';
  1302. }else if (c < 's') {
  1303. c = (c - 'a') / 3 + '2';
  1304. }
  1305. else {
  1306. c= (c - 'a'+1) / 3 + '2';
  1307. }
  1308. }
  1309. else if (isupper(c)) {
  1310. if (c == 'Z') {
  1311. c == 'a';
  1312. }else
  1313. c = tolower(c)+1;
  1314. }
  1315. }
  1316. cout << s;
  1317. return 0;
  1318. }
  1319. /*
  1320. HJ22 汽水瓶
  1321. 题目
  1322. 题解(431)
  1323. 讨论(1k)
  1324. 排行
  1325. 面经new
  1326. 简单 通过率:30.18% 时间限制:1秒 空间限制:32M
  1327. 知识点
  1328. 数学
  1329. 模拟
  1330. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  1331. 描述
  1332. 某商店规定:三个空汽水瓶可以换一瓶汽水,允许向老板借空汽水瓶(但是必须要归还)。
  1333. 小张手上有n个空汽水瓶,她想知道自己最多可以喝到多少瓶汽水。
  1334. 数据范围:输入的正整数满足 1 \le n \le 100 \1≤n≤100
  1335. 注意:本题存在多组输入。输入的 0 表示输入结束,并不用输出结果。
  1336. 输入描述:
  1337. 输入文件最多包含 10 组测试数据,每个数据占一行,仅包含一个正整数 n( 1<=n<=100 ),表示小张手上的空汽水瓶数。n=0 表示输入结束,你的程序不应当处理这一行。
  1338. 输出描述:
  1339. 对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出0。
  1340. 示例1
  1341. 输入:
  1342. 3
  1343. 10
  1344. 81
  1345. 0
  1346. 复制
  1347. 输出:
  1348. 1
  1349. 5
  1350. 40
  1351. 复制
  1352. 说明:
  1353. 样例 1 解释:用三个空瓶换一瓶汽水,剩一个空瓶无法继续交换
  1354. 样例 2 解释:用九个空瓶换三瓶汽水,剩四个空瓶再用三个空瓶换一瓶汽水,剩两个空瓶,向老板借一个空瓶再用三个空瓶换一瓶汽水喝完得一个空瓶还给老板
  1355. 相似企业真题
  1356. TOP
  1357. 2022年08月30日 21:55:51 星期二
  1358. 2022年08月30日 21:58:47 星期二 (3)
  1359. */
  1360. int main22() {
  1361. int n=1;
  1362. while (n) {
  1363. cin >> n;
  1364. if(n)
  1365. cout << n / 2 << endl;
  1366. }
  1367. return 0;
  1368. }
  1369. /*
  1370. HJ23 删除字符串中出现次数最少的字符
  1371. 题目
  1372. 题解(429)
  1373. 讨论(950)
  1374. 排行
  1375. 面经new
  1376. 简单 通过率:38.25% 时间限制:1秒 空间限制:32M
  1377. 知识点
  1378. 字符串
  1379. 哈希
  1380. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  1381. 描述
  1382. 实现删除字符串中出现次数最少的字符,若出现次数最少的字符有多个,则把出现次数最少的字符都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。
  1383. 数据范围:输入的字符串长度满足 1 \le n \le 20 \1≤n≤20 ,保证输入的字符串中仅出现小写字母
  1384. 输入描述:
  1385. 字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节。
  1386. 输出描述:
  1387. 删除字符串中出现次数最少的字符后的字符串。
  1388. 示例1
  1389. 输入:
  1390. aabcddd
  1391. 复制
  1392. 输出:
  1393. aaddd
  1394. 复制
  1395. 相似企业真题
  1396. TOP
  1397. 2022年08月30日 23:28:32 星期二
  1398. 2022年08月30日 23:35:37 星期二(7) */
  1399. int main23() {
  1400. string s;
  1401. cin >> s;
  1402. int num[26] = { 0 },min0=0x3f3f3f3f;
  1403. for (auto c : s) {
  1404. num[c - 'a']++;
  1405. }
  1406. for (int i = 0; i < 26; i++) {
  1407. if(num[i])
  1408. min0 = min(min0, num[i]);
  1409. }
  1410. string s0 = "";
  1411. for (int i = 0; i < 26; i++) {
  1412. if (min0 == num[i]) {
  1413. s0 += (i+'a');
  1414. }
  1415. }
  1416. for (auto c : s) {
  1417. if (s0.find(c) == string::npos) {
  1418. cout << c;
  1419. }
  1420. }
  1421. return 0;
  1422. }
  1423. /*
  1424. HJ24 合唱队
  1425. 题目
  1426. 题解(158)
  1427. 讨论(343)
  1428. 排行
  1429. 面经new
  1430. 中等 通过率:28.89% 时间限制:1秒 空间限制:32M
  1431. 知识点
  1432. 动态规划
  1433. 队列
  1434. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  1435. 描述
  1436. N 位同学站成一排,音乐老师要请最少的同学出列,使得剩下的 K 位同学排成合唱队形。
  1437. 设KK位同学从左到右依次编号为 1,2…,K ,他们的身高分别为T_1,T_2,…,T_KT
  1438. 1
  1439. ,T
  1440. 2
  1441. ,…,T
  1442. K
  1443. ,若存在i(1\leq i\leq K)i(1≤i≤K) 使得T_1<T_2<......<T_{i-1}<T_iT
  1444. 1
  1445. <T
  1446. 2
  1447. <......<T
  1448. i−1
  1449. <T
  1450. i
  1451. 且 T_i>T_{i+1}>......>T_KT
  1452. i
  1453. >T
  1454. i+1
  1455. >......>T
  1456. K
  1457. ,则称这KK名同学排成了合唱队形。
  1458. 通俗来说,能找到一个同学,他的两边的同学身高都依次严格降低的队形就是合唱队形。
  1459. 例子:
  1460. 123 124 125 123 121 是一个合唱队形
  1461. 123 123 124 122不是合唱队形,因为前两名同学身高相等,不符合要求
  1462. 123 122 121 122不是合唱队形,因为找不到一个同学,他的两侧同学身高递减。
  1463. 你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
  1464. 注意:不允许改变队列元素的先后顺序 且 不要求最高同学左右人数必须相等
  1465. 数据范围: 1 \le n \le 3000 \1≤n≤3000
  1466. 输入描述:
  1467. 用例两行数据,第一行是同学的总数 N ,第二行是 N 位同学的身高,以空格隔开
  1468. 输出描述:
  1469. 最少需要几位同学出列
  1470. 示例1
  1471. 输入:
  1472. 8
  1473. 186 186 150 200 160 130 197 200
  1474. 复制
  1475. 输出:
  1476. 4
  1477. 复制
  1478. 说明:
  1479. 由于不允许改变队列元素的先后顺序,所以最终剩下的队列应该为186 200 160 130或150 200 160 130
  1480. 相似企业真题
  1481. TOP
  1482. 2022年08月30日 23:37:07 星期二
  1483. 2022年08月31日 00:27:47 星期三(50) */
  1484. //梅花桩
  1485. int main24() {
  1486. int n,max0=0;
  1487. cin >> n;
  1488. int* h = new int[n];
  1489. //dp[i]:一从左边向右递增为例,表示前i个包括它自己的递增序列最长可有多少人,从头双层循环获得
  1490. int* dpl = new int[n];
  1491. int* dpr = new int[n];
  1492. //l[i]:表示前i个递增序列(可不包括自己)最长可有多少人,从头双层循环获得
  1493. int* l = new int[n];
  1494. int* r = new int[n];
  1495. for (int i = 0; i < n; i++) {
  1496. cin >> h[i];
  1497. }
  1498. //左边,dpl过程从头开始填,
  1499. for (int i = 0; i <n; i++) {
  1500. dpl[i] = 1; //初始为1(起码它本身)
  1501. for (int j = 0; j < i; j++) {
  1502. if (h[j] < h[i]) {
  1503. dpl[i] = max(dpl[i], dpl[j] + 1);
  1504. }
  1505. }
  1506. }
  1507. //右边
  1508. for (int i = n-1; i >=0; i--) {
  1509. dpr[i] = 1; //初始为1(起码它本身)
  1510. for (int j = i+1; j < n; j++) {
  1511. if (h[i] > h[j]) {
  1512. dpr[i] = max(dpr[i], dpr[j] + 1);
  1513. }
  1514. }
  1515. }
  1516. max0 = 0;
  1517. for (int i = 0; i < n; i++) { //i为中间人
  1518. max0 = max(max0, l[i] + r[i]); //因为第i人左右两边都重复计算了,所以最终得--
  1519. }
  1520. cout << n - (max0 - 1); //减去重复计算的人
  1521. return 0;
  1522. }
  1523. /*
  1524. HJ25 数据分类处理
  1525. 题目
  1526. 题解(172)
  1527. 讨论(406)
  1528. 排行
  1529. 面经new
  1530. 较难 通过率:26.15% 时间限制:1秒 空间限制:32M
  1531. 知识点
  1532. 排序
  1533. 模拟
  1534. 哈希
  1535. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  1536. 描述
  1537. 信息社会,有海量的数据需要分析处理,比如公安局分析身份证号码、 QQ 用户、手机号码、银行帐号等信息及活动记录。
  1538. 采集输入大数据和分类规则,通过大数据分类处理程序,将大数据分类输出。
  1539. 数据范围:1 \le I,R \le 100 \1≤I,R≤100 ,输入的整数大小满足 0 \le val \le 2^{31}-1\0≤val≤2
  1540. 31
  1541. −1
  1542. 输入描述:
  1543. 一组输入整数序列I和一组规则整数序列R,I和R序列的第一个整数为序列的个数(个数不包含第一个整数);整数范围为0~(2^31)-1,序列个数不限
  1544. 输出描述:
  1545. 从R依次中取出R<i>,对I进行处理,找到满足条件的I:
  1546. I整数对应的数字需要连续包含R<i>对应的数字。比如R<i>为23,I为231,那么I包含了R<i>,条件满足 。
  1547. 按R<i>从小到大的顺序:
  1548. (1)先输出R<i>;
  1549. (2)再输出满足条件的I的个数;
  1550. (3)然后输出满足条件的I在I序列中的位置索引(从0开始);
  1551. (4)最后再输出I。
  1552. 附加条件:
  1553. (1)R<i>需要从小到大排序。相同的R<i>只需要输出索引小的以及满足条件的I,索引大的需要过滤掉
  1554. (2)如果没有满足条件的I,对应的R<i>不用输出
  1555. (3)最后需要在输出序列的第一个整数位置记录后续整数序列的个数(不包含“个数”本身)
  1556. 序列I:15,123,456,786,453,46,7,5,3,665,453456,745,456,786,453,123(第一个15表明后续有15个整数)
  1557. 序列R:5,6,3,6,3,0(第一个5表明后续有5个整数)
  1558. 输出:30, 3,6,0,123,3,453,7,3,9,453456,13,453,14,123,6,7,1,456,2,786,4,46,8,665,9,453456,11,456,12,786
  1559. 说明:
  1560. 30----后续有30个整数
  1561. 3----从小到大排序,第一个R<i>为0,但没有满足条件的I,不输出0,而下一个R<i>是3
  1562. 6--- 存在6个包含3的I
  1563. 0--- 123所在的原序号为0
  1564. 123--- 123包含3,满足条件
  1565. 示例1
  1566. 输入:
  1567. 15 123 456 786 453 46 7 5 3 665 453456 745 456 786 453 123
  1568. 5 6 3 6 3 0
  1569. 复制
  1570. 输出:
  1571. 30 3 6 0 123 3 453 7 3 9 453456 13 453 14 123 6 7 1 456 2 786 4 46 8 665 9 453456 11 456 12 786
  1572. 复制
  1573. 说明:
  1574. 将序列R:5,6,3,6,3,0(第一个5表明后续有5个整数)排序去重后,可得0,3,6。
  1575. 序列I没有包含0的元素。
  1576. 序列I中包含3的元素有:I[0]的值为123、I[3]的值为453、I[7]的值为3、I[9]的值为453456、I[13]的值为453、I[14]的值为123。
  1577. 序列I中包含6的元素有:I[1]的值为456、I[2]的值为786、I[4]的值为46、I[8]的值为665、I[9]的值为453456、I[11]的值为456、I[12]的值为786。
  1578. 最后按题目要求的格式进行输出即可。
  1579. 相似企业真题
  1580. TOP
  1581. 2022年08月31日 12:45:05 星期三
  1582. 2022年08月31日 13:29:38 星期三 (45)*/
  1583. int main25() {
  1584. int n1, n2,num;
  1585. cin >> n1;
  1586. string* arr = new string[n1];
  1587. for (int i = 0; i < n1; i++) {
  1588. cin >> arr[i];
  1589. }
  1590. cin >> n2;
  1591. set<int> s0;
  1592. while (n2--)
  1593. {
  1594. cin >> num;
  1595. s0.insert(num); //int才有排序去重
  1596. }
  1597. int size = s0.size(),j=0,sum=0; //j标识set下标,sum为数字个数
  1598. vector<string> res;
  1599. vector<string>* value = new vector<string>[size]; //二维数组,size行,每行为动态数组vector
  1600. vector<int>* i = new vector<int>[size]; //二维数组,size行,每行为动态数组vector
  1601. for (auto it : s0) {
  1602. res.push_back(to_string(it));
  1603. for (int k = 0; k < n1; k++) {
  1604. if (arr[k].find(res[j]) != string::npos) {
  1605. value[j].push_back(arr[k]);
  1606. i[j].push_back(k);
  1607. }
  1608. }
  1609. j++;
  1610. }
  1611. string s3 = ""; //结果字符串
  1612. for (int j = 0; j < size; j++) {
  1613. if (!value[j].empty()) {
  1614. sum = sum + 2 + 2 * value[j].size();
  1615. s3 = s3 +" "+ res[j] + " "+to_string(value[j].size());
  1616. for (int k = 0; k < value[j].size(); k++) {
  1617. s3 = s3+ " " + to_string(i[j][k]) + " " + value[j][k] ;
  1618. }
  1619. }
  1620. }
  1621. cout << sum << s3;
  1622. return 0;
  1623. }
  1624. /*
  1625. HJ26 字符串排序
  1626. 题目
  1627. 题解(317)
  1628. 讨论(703)
  1629. 排行
  1630. 面经new
  1631. 中等 通过率:41.60% 时间限制:1秒 空间限制:32M
  1632. 知识点
  1633. 字符串
  1634. 排序
  1635. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  1636. 描述
  1637. 编写一个程序,将输入字符串中的字符按如下规则排序。
  1638. 规则 1 :英文字母从 A 到 Z 排列,不区分大小写。
  1639. 如,输入: Type 输出: epTy
  1640. 规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。
  1641. 如,输入: BabA 输出: aABb
  1642. 规则 3 :非英文字母的其它字符保持原来的位置。
  1643. 如,输入: By?e 输出: Be?y
  1644. 数据范围:输入的字符串长度满足 1 \le n \le 1000 \1≤n≤1000
  1645. 输入描述:
  1646. 输入字符串
  1647. 输出描述:
  1648. 输出字符串
  1649. 示例1
  1650. 输入:
  1651. A Famous Saying: Much Ado About Nothing (2012/8).
  1652. 复制
  1653. 输出:
  1654. A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).
  1655. 复制
  1656. 相似企业真题
  1657. TOP
  1658. 2022年08月31日 13:30:09 星期三
  1659. 2022年08月31日 13:43:43 星期三 (13)*/
  1660. bool cmp26(char a, char b) {
  1661. return tolower(a) < tolower(b);
  1662. }
  1663. int main26() {
  1664. string s,s1="";
  1665. getline(cin, s);
  1666. for (auto it : s) {
  1667. if (isalpha(it)) {
  1668. s1 += it;
  1669. }
  1670. }
  1671. stable_sort(s1.begin(), s1.end(), cmp26); //记住
  1672. int j = 0; //s1下标
  1673. for (auto &it : s) {
  1674. if (isalpha(it)) {
  1675. it = s1[j++];
  1676. }
  1677. }
  1678. cout << s;
  1679. return 0;
  1680. }
  1681. /*
  1682. HJ27 查找兄弟单词
  1683. 题目
  1684. 题解(334)
  1685. 讨论(642)
  1686. 排行
  1687. 面经new
  1688. 中等 通过率:24.03% 时间限制:1秒 空间限制:32M
  1689. 知识点
  1690. 查找
  1691. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  1692. 描述
  1693. 定义一个单词的“兄弟单词”为:交换该单词字母顺序(注:可以交换任意次),而不添加、删除、修改原有的字母就能生成的单词。
  1694. 兄弟单词要求和原来的单词不同。例如: ab 和 ba 是兄弟单词。 ab 和 ab 则不是兄弟单词。
  1695. 现在给定你 n 个单词,另外再给你一个单词 x ,让你寻找 x 的兄弟单词里,按字典序排列后的第 k 个单词是什么?
  1696. 注意:字典中可能有重复单词。
  1697. 数据范围:1 \le n \le 1000 \1≤n≤1000 ,输入的字符串长度满足 1 \le len(str) \le 10 \1≤len(str)≤10 , 1 \le k < n \1≤k<n
  1698. 输入描述:
  1699. 输入只有一行。 先输入字典中单词的个数n,再输入n个单词作为字典单词。 然后输入一个单词x 最后后输入一个整数k
  1700. 输出描述:
  1701. 第一行输出查找到x的兄弟单词的个数m 第二行输出查找到的按照字典顺序排序后的第k个兄弟单词,没有符合第k个的话则不用输出。
  1702. 示例1
  1703. 输入:
  1704. 3 abc bca cab abc 1
  1705. 复制
  1706. 输出:
  1707. 2
  1708. bca
  1709. 复制
  1710. 示例2
  1711. 输入:
  1712. 6 cab ad abcd cba abc bca abc 1
  1713. 复制
  1714. 输出:
  1715. 3
  1716. bca
  1717. 复制
  1718. 说明:
  1719. abc的兄弟单词有cab cba bca,所以输出3
  1720. 经字典序排列后,变为bca cab cba,所以第1个字典序兄弟单词为bca
  1721. 相似企业真题
  1722. TOP
  1723. 2022年08月31日 13:44:03 星期三
  1724. 2022年08月31日 14:02:37 星期三 (17)*/
  1725. int main27() {
  1726. int n,n2=0,k,m=0;
  1727. cin >> n;
  1728. string* arr = new string[n];
  1729. string* arr2 = new string[n];
  1730. string s, s2;
  1731. for (int i = 0; i < n; i++) {
  1732. cin >> arr[i];
  1733. arr2[i] = arr[i];
  1734. sort(arr2[i].begin(), arr2[i].end());
  1735. }
  1736. cin >> s>>k;
  1737. s2 = s;
  1738. sort(s2.begin(), s2.end());
  1739. for (int i = 0; i < n; i++) {
  1740. if (s2 == arr2[i] && s != arr[i]) {
  1741. m++;
  1742. }
  1743. else {
  1744. arr[i] = "z";
  1745. }
  1746. }
  1747. sort(arr, arr + n);
  1748. cout << m << endl;
  1749. if(k<=m)
  1750. cout<< arr[k - 1];
  1751. return 0;
  1752. }
  1753. /*
  1754. HJ28 素数伴侣
  1755. 题目
  1756. 题解(15)
  1757. 讨论(153)
  1758. 排行
  1759. 面经new
  1760. 困难 通过率:26.02% 时间限制:1秒 空间限制:32M
  1761. 知识点
  1762. 查找
  1763. 排序
  1764. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  1765. 描述
  1766. 题目描述
  1767. 若两个正整数的和为素数,则这两个正整数称之为“素数伴侣”,如2和5、6和13,它们能应用于通信加密。现在密码学会请你设计一个程序,从已有的 N ( N 为偶数)个正整数中挑选出若干对组成“素数伴侣”,挑选方案多种多样,例如有4个正整数:2,5,6,13,如果将5和6分为一组中只能得到一组“素数伴侣”,而将2和5、6和13编组将得到两组“素数伴侣”,能组成“素数伴侣”最多的方案称为“最佳方案”,当然密码学会希望你寻找出“最佳方案”。
  1768. 输入:
  1769. 有一个正偶数 n ,表示待挑选的自然数的个数。后面给出 n 个具体的数字。
  1770. 输出:
  1771. 输出一个整数 K ,表示你求得的“最佳方案”组成“素数伴侣”的对数。
  1772. 数据范围: 1 \le n \le 100 \1≤n≤100 ,输入的数据大小满足 2 \le val \le 30000 \2≤val≤30000
  1773. 输入描述:
  1774. 输入说明
  1775. 1 输入一个正偶数 n
  1776. 2 输入 n 个整数
  1777. 输出描述:
  1778. 求得的“最佳方案”组成“素数伴侣”的对数。
  1779. 示例1
  1780. 输入:
  1781. 4
  1782. 2 5 6 13
  1783. 复制
  1784. 输出:
  1785. 2
  1786. 复制
  1787. 示例2
  1788. 输入:
  1789. 2
  1790. 3 6
  1791. 复制
  1792. 输出:
  1793. 0
  1794. 复制
  1795. 相似企业真题
  1796. TOP
  1797. 试下用存暴力(全排列搞?)
  1798. 2022年08月31日 14:37:02 星期三 */
  1799. //超时
  1800. bool judge28(int num) {
  1801. for (int i = 2; i <= sqrt(num); i++) {
  1802. if (!(num % i)) {
  1803. return false;
  1804. }
  1805. }
  1806. return true;
  1807. }
  1808. int main28() {
  1809. int n, num, n2, max0 = 0;;
  1810. cin >> n;
  1811. if (n == 1) {
  1812. cout << 0;
  1813. return 0;
  1814. }
  1815. vector<int> arr1, arr2; //存奇数偶数
  1816. while (n--) {
  1817. cin >> num;
  1818. if (num % 2) {
  1819. arr1.push_back(num); //奇数
  1820. }
  1821. else
  1822. arr2.push_back(num);
  1823. }
  1824. if (arr1.empty()||arr2.empty()) {
  1825. cout << 0;
  1826. return 0;
  1827. }
  1828. if (arr1.size() > arr2.size()) {
  1829. swap(arr1, arr2); //arr2大,全排列
  1830. }
  1831. do {
  1832. n2 = 0; //当前排列对数初始为0
  1833. for (int i = 0; i < arr1.size(); i++) {
  1834. if (judge28(arr1[i] + arr2[i])) {
  1835. n2++;
  1836. }
  1837. }
  1838. max0 = max(n2, max0);
  1839. if (max0 == arr1.size()) {
  1840. break;
  1841. }
  1842. } while (next_permutation(arr2.begin(), arr2.end()));
  1843. cout << max0;
  1844. return 0;
  1845. }
  1846. /*
  1847. HJ29 字符串加解密
  1848. 题目
  1849. 题解(273)
  1850. 讨论(564)
  1851. 排行
  1852. 面经new
  1853. 中等 通过率:30.06% 时间限制:1秒 空间限制:32M
  1854. 知识点
  1855. 字符串
  1856. 模拟
  1857. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  1858. 描述
  1859. 对输入的字符串进行加解密,并输出。
  1860. 加密方法为:
  1861. 当内容是英文字母时则用该英文字母的后一个字母替换,同时字母变换大小写,如字母a时则替换为B;字母Z时则替换为a;
  1862. 当内容是数字时则把该数字加1,如0替换1,1替换2,9替换0;
  1863. 其他字符不做变化。
  1864. 解密方法为加密的逆过程。
  1865. 数据范围:输入的两个字符串长度满足 1 \le n \le 1000 \1≤n≤1000 ,保证输入的字符串都是只由大小写字母或者数字组成
  1866. 输入描述:
  1867. 第一行输入一串要加密的密码
  1868. 第二行输入一串加过密的密码
  1869. 输出描述:
  1870. 第一行输出加密后的字符
  1871. 第二行输出解密后的字符
  1872. 示例1
  1873. 输入:
  1874. abcdefg
  1875. BCDEFGH
  1876. 复制
  1877. 输出:
  1878. BCDEFGH
  1879. abcdefg
  1880. 复制
  1881. 相似企业真题
  1882. TOP
  1883. 2022年08月31日 14:59:25 星期三
  1884. 2022年08月31日 15:04:22 星期三 */
  1885. int main29() {
  1886. string s1, s2;
  1887. cin >> s1 >> s2;
  1888. for (auto& c : s1) {
  1889. if (islower(c)) {
  1890. c = ((c - 'a') + 1) % 26 + 'A';
  1891. }else if (isupper(c)) {
  1892. c = ((c - 'A') + 1) % 26 + 'a';
  1893. }else if (isdigit(c)) {
  1894. c = ((c - '0') + 1) % 10 + '0';
  1895. }
  1896. }
  1897. for (auto& c : s2) {
  1898. if (islower(c)) {
  1899. c = ((c - 'a') - 1) % 26 + 'A';
  1900. }
  1901. else if (isupper(c)) {
  1902. c = ((c - 'A') - 1) % 26 + 'a';
  1903. }
  1904. else if (isdigit(c)) {
  1905. c = ((c - '0') - 1) % 10 + '0';
  1906. }
  1907. }
  1908. cout << s1 << endl << s2;
  1909. return 0;
  1910. }
  1911. /*
  1912. HJ30 字符串合并处理
  1913. 题目
  1914. 题解(192)
  1915. 讨论(426)
  1916. 排行
  1917. 面经new
  1918. 较难 通过率:28.22% 时间限制:1秒 空间限制:32M
  1919. 知识点
  1920. 字符串
  1921. 排序
  1922. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  1923. 描述
  1924. 按照指定规则对输入的字符串进行处理。
  1925. 详细描述:
  1926. 第一步:将输入的两个字符串str1和str2进行前后合并。如给定字符串 "dec" 和字符串 "fab" , 合并后生成的字符串为 "decfab"
  1927. 第二步:对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序。这里的下标的意思是字符在字符串中的位置。注意排序后在新串中仍需要保持原来的奇偶性。例如刚刚得到的字符串“decfab”,分别对下标为偶数的字符'd'、'c'、'a'和下标为奇数的字符'e'、'f'、'b'进行排序(生成 'a'、'c'、'd' 和 'b' 、'e' 、'f'),再依次分别放回原串中的偶数位和奇数位,新字符串变为“abcedf”
  1928. 第三步:对排序后的字符串中的'0'~'9'、'A'~'F'和'a'~'f'字符,需要进行转换操作。
  1929. 转换规则如下:
  1930. 对以上需要进行转换的字符所代表的十六进制用二进制表示并倒序,然后再转换成对应的十六进制大写字符(注:字符 a~f 的十六进制对应十进制的10~15,大写同理)。
  1931. 如字符 '4',其二进制为 0100 ,则翻转后为 0010 ,也就是 2 。转换后的字符为 '2'。
  1932. 如字符 ‘7’,其二进制为 0111 ,则翻转后为 1110 ,对应的十进制是14,转换为十六进制的大写字母为 'E'。
  1933. 如字符 'C',代表的十进制是 12 ,其二进制为 1100 ,则翻转后为 0011,也就是3。转换后的字符是 '3'。
  1934. 根据这个转换规则,由第二步生成的字符串 “abcedf” 转换后会生成字符串 "5D37BF"。
  1935. 数据范围:输入的字符串长度满足 1 \le n \le 100 \1≤n≤100
  1936. 输入描述:
  1937. 样例输入两个字符串,用空格隔开。
  1938. 输出描述:
  1939. 输出转化后的结果。
  1940. 示例1
  1941. 输入:
  1942. dec fab
  1943. 复制
  1944. 输出:
  1945. 5D37BF
  1946. 复制
  1947. 示例2
  1948. 输入:
  1949. ab CD
  1950. 复制
  1951. 输出:
  1952. 3B5D
  1953. 复制
  1954. 说明:
  1955. 合并后为abCD,按奇数位和偶数位排序后是CDab(请注意要按ascii码进行排序,所以C在a前面,D在b前面),转换后为3B5D
  1956. 示例3
  1957. 输入:
  1958. 123 15
  1959. 复制
  1960. 输出:
  1961. 88C4A
  1962. 复制
  1963. 相似企业真题
  1964. TOP
  1965. 用投机手算
  1966. 2022年08月31日 15:04:42 星期三
  1967. 2022年08月31日 15:27:43 星期三 (23)
  1968. */
  1969. int main30() {
  1970. string s1, s2,s3="";
  1971. cin >> s1 >> s2;
  1972. s1 += s2;
  1973. int i = 0;
  1974. string res = "084C2A6E195D3B7F";
  1975. s2 = "";
  1976. for(auto c:s1){
  1977. if (i % 2) {
  1978. s3 += c; //奇数串
  1979. }
  1980. else {
  1981. s2 += c;
  1982. }
  1983. i++;
  1984. }
  1985. sort(s2.begin(), s2.end());
  1986. sort(s3.begin(), s3.end());
  1987. s1 = "";
  1988. for (i = 0; i < s2.size() && i < s3.size(); i++) {
  1989. s1 =s1+ s2[i] + s3[i];
  1990. }
  1991. if (s2.size()!=s3.size()) {
  1992. s1 += s2[i];
  1993. }
  1994. for (auto& c : s1) {
  1995. if (isdigit(c)) {
  1996. c = res[c - '0'];
  1997. }
  1998. else if (c >= 'a' && c <= 'f') {
  1999. c = res[c - 'a' + 10];
  2000. }
  2001. else if (c >= 'A' && c <= 'F') {
  2002. c = res[c - 'A' + 10];
  2003. }
  2004. }
  2005. cout << s1;
  2006. return 0;
  2007. }
  2008. /*
  2009. HJ31 单词倒排
  2010. 题目
  2011. 题解(429)
  2012. 讨论(812)
  2013. 排行
  2014. 面经new
  2015. 简单 通过率:28.43% 时间限制:1秒 空间限制:32M
  2016. 知识点
  2017. 排序
  2018. 字符串
  2019. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  2020. 描述
  2021. 对字符串中的所有单词进行倒排。
  2022. 说明:
  2023. 1、构成单词的字符只有26个大写或小写英文字母;
  2024. 2、非构成单词的字符均视为单词间隔符;
  2025. 3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;
  2026. 4、每个单词最长20个字母;
  2027. 数据范围:字符串长度满足 1 \le n \le 10000 \1≤n≤10000
  2028. 输入描述:
  2029. 输入一行,表示用来倒排的句子
  2030. 输出描述:
  2031. 输出句子的倒排结果
  2032. 示例1
  2033. 输入:
  2034. I am a student
  2035. 复制
  2036. 输出:
  2037. student a am I
  2038. 复制
  2039. 示例2
  2040. 输入:
  2041. $bo*y gi!r#l
  2042. 复制
  2043. 输出:
  2044. l r gi y bo
  2045. 复制
  2046. 相似企业真题
  2047. TOP
  2048. 2022年08月31日 15:28:12 星期三
  2049. 2022年08月31日 15:34:18 星期三(6) */
  2050. int main31() {
  2051. string s,s1;
  2052. getline(cin, s);
  2053. for (auto& c : s) {
  2054. if (!isalpha(c)) {
  2055. c = ' ';
  2056. }
  2057. }
  2058. istringstream input(s);
  2059. vector<string> v;
  2060. while (input >> s1) {
  2061. v.push_back(s1);
  2062. }
  2063. reverse(v.begin(), v.end());
  2064. for (auto it : v) {
  2065. cout << it<<' ';
  2066. }
  2067. return 0;
  2068. }
  2069. /*
  2070. HJ32 密码截取
  2071. 题目
  2072. 题解(233)
  2073. 讨论(406)
  2074. 排行
  2075. 面经new
  2076. 中等 通过率:33.39% 时间限制:1秒 空间限制:32M
  2077. 知识点
  2078. 字符串
  2079. 动态规划
  2080. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  2081. 描述
  2082. Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解。比如进行下列变化 ABBA->12ABBA,ABA->ABAKK,123321->51233214 。因为截获的串太长了,而且存在多种可能的情况(abaaab可看作是aba,或baaab的加密形式),Cathcer的工作量实在是太大了,他只能向电脑高手求助,你能帮Catcher找出最长的有效密码串吗?
  2083. 数据范围:字符串长度满足 1 \le n \le 2500 \1≤n≤2500
  2084. 输入描述:
  2085. 输入一个字符串(字符串的长度不超过2500)
  2086. 输出描述:
  2087. 返回有效密码串的最大长度
  2088. 示例1
  2089. 输入:
  2090. ABBA
  2091. 复制
  2092. 输出:
  2093. 4
  2094. 复制
  2095. 示例2
  2096. 输入:
  2097. ABBBA
  2098. 复制
  2099. 输出:
  2100. 5
  2101. 复制
  2102. 示例3
  2103. 输入:
  2104. 12HHHHA
  2105. 复制
  2106. 输出:
  2107. 4
  2108. 复制
  2109. 相似企业真题
  2110. TOP
  2111. 2022年08月31日 15:34:42 星期三
  2112. 2022年08月31日 15:49:34 星期三 */
  2113. //用bool dp[i][j]上三角从i到j是否回文,对角先填,在从下到上,从左到右
  2114. //本身和双同为 1,对角2行可判断,不断更新maxres
  2115. int main32(){
  2116. string s;
  2117. cin >> s;
  2118. int res = 1; //最短长度1单字符
  2119. int n = s.size();
  2120. bool** dp = new bool* [n];
  2121. for (int i = 0; i < n; i++) {
  2122. dp[i] = new bool[n]{ 1 }; //上三角,单字符为1
  2123. if (i != n - 1 && s[i] == s[i + 1]) {
  2124. dp[i][i+1] = 1; //双同顺带写上
  2125. if (res <2) {
  2126. res = 2; //更新res
  2127. }
  2128. }
  2129. }
  2130. for (int i = n - 2; i >= 0; i--) {
  2131. for (int j = i+2; j < n; j++) {
  2132. if (dp[i + 1][j - 1] && s[i] == s[j]) {
  2133. dp[i][j] = 1; //中间回文,2头相同回文
  2134. if (res < j - i + 1) {
  2135. res = j - i + 1; //更新res
  2136. }
  2137. }
  2138. }
  2139. }
  2140. cout << res;
  2141. return 0;
  2142. }
  2143. /*
  2144. HJ33 整数与IP地址间的转换
  2145. 题目
  2146. 题解(251)
  2147. 讨论(448)
  2148. 排行
  2149. 面经new
  2150. 中等 通过率:36.78% 时间限制:1秒 空间限制:32M
  2151. 知识点
  2152. 字符串
  2153. 模拟
  2154. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  2155. 描述
  2156. 原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成
  2157. 一个长整数。
  2158. 举例:一个ip地址为10.0.3.193
  2159. 每段数字 相对应的二进制数
  2160. 10 00001010
  2161. 0 00000000
  2162. 3 00000011
  2163. 193 11000001
  2164. 组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。
  2165. 数据范围:保证输入的是合法的 IP 序列
  2166. 输入描述:
  2167. 输入
  2168. 1 输入IP地址
  2169. 2 输入10进制型的IP地址
  2170. 输出描述:
  2171. 输出
  2172. 1 输出转换成10进制的IP地址
  2173. 2 输出转换后的IP地址
  2174. 示例1
  2175. 输入:
  2176. 10.0.3.193
  2177. 167969729
  2178. 复制
  2179. 输出:
  2180. 167773121
  2181. 10.3.3.193
  2182. 复制
  2183. 相似企业真题
  2184. TOP
  2185. 2022年08月31日 15:49:51 星期三
  2186. 2022年08月31日 16:02:37 星期三 */
  2187. int main33() {
  2188. int a, b, c, d,e;
  2189. scanf_s("%d.%d.%d.%d", &a, &b, &c, &d);
  2190. long long res = d + 256 * (c + 256 * (b + 256 * a));
  2191. cout<<res<<endl;
  2192. cin >> e;
  2193. long f = 256 * 256 * 256;
  2194. while (1) {
  2195. cout << e / f;
  2196. e %= f;
  2197. f /= 256;
  2198. if (f) {
  2199. cout << '.';
  2200. }
  2201. else {
  2202. break;
  2203. }
  2204. }
  2205. return 0;
  2206. }
  2207. /*
  2208. HJ34 图片整理
  2209. 题目
  2210. 题解(274)
  2211. 讨论(465)
  2212. 排行
  2213. 面经new
  2214. 简单 通过率:53.83% 时间限制:1秒 空间限制:32M
  2215. 知识点
  2216. 字符串
  2217. 排序
  2218. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  2219. 描述
  2220. Lily上课时使用字母数字图片教小朋友们学习英语单词,每次都需要把这些图片按照大小(ASCII码值从小到大)排列收好。请大家给Lily帮忙,通过代码解决。
  2221. Lily使用的图片使用字符"A"到"Z"、"a"到"z"、"0"到"9"表示。
  2222. 数据范围:每组输入的字符串长度满足 1 \le n \le 1000 \1≤n≤1000
  2223. 输入描述:
  2224. 一行,一个字符串,字符串中的每个字符表示一张Lily使用的图片。
  2225. 输出描述:
  2226. Lily的所有图片按照从小到大的顺序输出
  2227. 示例1
  2228. 输入:
  2229. Ihave1nose2hands10fingers
  2230. 复制
  2231. 输出:
  2232. 0112Iaadeeefghhinnnorsssv
  2233. 复制
  2234. 相似企业真题
  2235. TOP
  2236. 2022年08月31日 16:04:25 星期三
  2237. 2022年08月31日 16:05:13 星期三 (1)*/
  2238. int main34() {
  2239. string s;
  2240. cin >> s;
  2241. sort(s.begin(), s.end());
  2242. cout << s;
  2243. return 0;
  2244. }
  2245. /*
  2246. HJ35 蛇形矩阵
  2247. 题目
  2248. 题解(374)
  2249. 讨论(684)
  2250. 排行
  2251. 面经new
  2252. 简单 通过率:49.91% 时间限制:1秒 空间限制:32M
  2253. 知识点
  2254. 数组
  2255. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  2256. 描述
  2257. 蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。
  2258. 例如,当输入5时,应该输出的三角形为:
  2259. 1 3 6 10 15
  2260. 2 5 9 14
  2261. 4 8 13
  2262. 7 12
  2263. 11
  2264. 输入描述:
  2265. 输入正整数N(N不大于100)
  2266. 输出描述:
  2267. 输出一个N行的蛇形矩阵。
  2268. 示例1
  2269. 输入:
  2270. 4
  2271. 复制
  2272. 输出:
  2273. 1 3 6 10
  2274. 2 5 9
  2275. 4 8
  2276. 7
  2277. 复制
  2278. 相似企业真题
  2279. TOP
  2280. */
  2281. int main35() {
  2282. int n,d;
  2283. cin >> n;
  2284. for (int i = 0; i < n; i++) {
  2285. d= (1 + i) * i / 2 + 1;
  2286. cout << d;
  2287. for (int j = i+1; j < n; j++) {
  2288. d += (j + 1);
  2289. cout << " " << d;
  2290. }
  2291. cout << endl;
  2292. }
  2293. return 0;
  2294. }
  2295. /*
  2296. HJ36 字符串加密
  2297. 题目
  2298. 题解(275)
  2299. 讨论(572)
  2300. 排行
  2301. 面经new
  2302. 中等 通过率:45.59% 时间限制:1秒 空间限制:32M
  2303. 知识点
  2304. 字符串
  2305. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  2306. 描述
  2307. 有一种技巧可以对数据进行加密,它使用一个单词作为它的密匙。下面是它的工作原理:首先,选择一个单词作为密匙,如TRAILBLAZERS。如果单词中包含有重复的字母,只保留第1个,将所得结果作为新字母表开头,并将新建立的字母表中未出现的字母按照正常字母表顺序加入新字母表。如下所示:
  2308. A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
  2309. T R A I L B Z E S C D F G H J K M N O P Q U V W X Y (实际需建立小写字母的字母表,此字母表仅为方便演示)
  2310. 上面其他用字母表中剩余的字母填充完整。在对信息进行加密时,信息中的每个字母被固定于顶上那行,并用下面那行的对应字母一一取代原文的字母(字母字符的大小写状态应该保留)。因此,使用这个密匙, Attack AT DAWN (黎明时攻击)就会被加密为Tpptad TP ITVH。
  2311. 请实现下述接口,通过指定的密匙和明文得到密文。
  2312. 数据范围:1 \le n \le 100 \1≤n≤100 ,保证输入的字符串中仅包含小写字母
  2313. 输入描述:
  2314. 先输入key和要加密的字符串
  2315. 输出描述:
  2316. 返回加密后的字符串
  2317. 示例1
  2318. 输入:
  2319. nihao
  2320. ni
  2321. 复制
  2322. 输出:
  2323. le
  2324. 复制
  2325. 相似企业真题
  2326. TOP
  2327. 2022年08月31日 16:25:28 星期三
  2328. 2022年08月31日 16:39:49 星期三 (14)*/
  2329. int main36() {
  2330. string s, s1,s2="";
  2331. int num[26];
  2332. cin >> s >> s1;
  2333. set<char> set0;
  2334. for (auto c : s) {
  2335. if (set0.insert(c).second) {
  2336. s2 += c;
  2337. }
  2338. }
  2339. for (char c = 'a'; c <= 'z'; c++) {
  2340. if (set0.insert(c).second) {
  2341. s2 += c;
  2342. }
  2343. }
  2344. for (int i = 0; i < 26; i++) {
  2345. num[i] = s2[i] - 'a'-i;
  2346. }
  2347. for (auto& c : s1) {
  2348. c += num[tolower(c) - 'a'];
  2349. }
  2350. cout << s1;
  2351. return 0;
  2352. }
  2353. /*
  2354. HJ37 统计每个月兔子的总数
  2355. 题目
  2356. 题解(313)
  2357. 讨论(666)
  2358. 排行
  2359. 面经new
  2360. 简单 通过率:46.83% 时间限制:1秒 空间限制:32M
  2361. 知识点
  2362. 查找
  2363. 排序
  2364. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  2365. 描述
  2366. 有一种兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子。
  2367. 例子:假设一只兔子第3个月出生,那么它第5个月开始会每个月生一只兔子。
  2368. 一月的时候有一只兔子,假如兔子都不死,问第n个月的兔子总数为多少?
  2369. 数据范围:输入满足 1 \le n \le 31 \1≤n≤31
  2370. 输入描述:
  2371. 输入一个int型整数表示第n个月
  2372. 输出描述:
  2373. 输出对应的兔子总数
  2374. 示例1
  2375. 输入:
  2376. 3
  2377. 复制
  2378. 输出:
  2379. 2
  2380. 复制
  2381. 相似企业真题
  2382. TOP
  2383. 递归,2数组记录
  2384. 2022年08月31日 16:40:12 星期三
  2385. 2022年08月31日 16:47:25 星期三 (7)*/
  2386. int main37() {
  2387. int n;
  2388. cin >> n;
  2389. if (n < 3) {
  2390. cout << 1;
  2391. return 0;
  2392. }
  2393. int* mother = new int[n] {0}; //第i+1月时母兔个数
  2394. int* child = new int[n] {1}; //当月出生小兔
  2395. for (int i = 2; i < n; i++) {
  2396. mother[i] = mother[i - 1] + child[i - 2]; //2个月前的小兔成熟了,增加到当月母兔
  2397. child[i] = mother[i]; //当月出生小兔
  2398. }
  2399. cout << mother[n - 1] + child[n - 2] + child[n - 1]; //当前兔子数包括当下母兔+小兔(本月和上个月)
  2400. return 0;
  2401. }
  2402. /*
  2403. HJ38 求小球落地5次后所经历的路程和第5次反弹的高度
  2404. 题目
  2405. 题解(194)
  2406. 讨论(395)
  2407. 排行
  2408. 面经new
  2409. 中等 通过率:43.53% 时间限制:1秒 空间限制:32M
  2410. 知识点
  2411. 模拟
  2412. 思维
  2413. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  2414. 描述
  2415. 假设一个球从任意高度自由落下,每次落地后反跳回原高度的一半; 再落下, 求它在第5次落地时,共经历多少米?第5次反弹多高?
  2416. 数据范围:输入的小球初始高度满足 1 \le n \le 1000 \1≤n≤1000 ,且保证是一个整数
  2417. 输入描述:
  2418. 输入起始高度,int型
  2419. 输出描述:
  2420. 分别输出第5次落地时,共经过多少米以及第5次反弹多高。
  2421. 注意:你可以认为你输出保留六位或以上小数的结果可以通过此题。
  2422. 示例1
  2423. 输入:
  2424. 1
  2425. 复制
  2426. 输出:
  2427. 2.875
  2428. 0.03125
  2429. 复制
  2430. 相似企业真题
  2431. TOP
  2432. */
  2433. int main38() {
  2434. int h;
  2435. cin >> h;
  2436. cout << 23.0 / 8 * h << endl << 1.0 / 32 * h;
  2437. return 0;
  2438. }
  2439. /*
  2440. HJ39 判断两个IP是否属于同一子网
  2441. 题目
  2442. 题解(169)
  2443. 讨论(341)
  2444. 排行
  2445. 面经new
  2446. 较难 通过率:21.08% 时间限制:1秒 空间限制:32M
  2447. 知识点
  2448. 字符串
  2449. 模拟
  2450. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  2451. 描述
  2452. IP地址是由4个0-255之间的整数构成的,用"."符号相连。
  2453. 二进制的IP地址格式有32位,例如:10000011,01101011,00000011,00011000;每八位用十进制表示就是131.107.3.24
  2454. 子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。
  2455. 子网掩码与IP地址结构相同,是32位二进制数,由1和0组成,且1和0分别连续,其中网络号部分全为“1”和主机号部分全为“0”。
  2456. 你可以简单的认为子网掩码是一串连续的1和一串连续的0拼接而成的32位二进制数,左边部分都是1,右边部分都是0。
  2457. 利用子网掩码可以判断两台主机是否在同一子网中。
  2458. 若两台主机的IP地址分别与它们的子网掩码进行逻辑“与”运算(按位与/AND)后的结果相同,则说明这两台主机在同一子网中。
  2459. 示例:
  2460. I P 地址  192.168.0.1
  2461. 子网掩码  255.255.255.0
  2462. 转化为二进制进行运算:
  2463. I P 地址  11000000.10101000.00000000.00000001
  2464. 子网掩码 11111111.11111111.11111111.00000000
  2465. AND运算 11000000.10101000.00000000.00000000
  2466. 转化为十进制后为:
  2467. 192.168.0.0
  2468. I P 地址  192.168.0.254
  2469. 子网掩码  255.255.255.0
  2470. 转化为二进制进行运算:
  2471. I P 地址 11000000.10101000.00000000.11111110
  2472. 子网掩码 11111111.11111111.11111111.00000000
  2473. AND运算 11000000.10101000.00000000.00000000
  2474. 转化为十进制后为:
  2475. 192.168.0.0
  2476. 通过以上对两台计算机IP地址与子网掩码的AND运算后,我们可以看到它运算结果是一样的。均为192.168.0.0,所以这二台计算机可视为是同一子网络。
  2477. 输入一个子网掩码以及两个ip地址,判断这两个ip地址是否是一个子网络。
  2478. 若IP地址或子网掩码格式非法则输出1,若IP1与IP2属于同一子网络输出0,若IP1与IP2不属于同一子网络输出2。
  2479. 注:
  2480. 有效掩码与IP的性质为:
  2481. 1. 掩码与IP每一段在 0 - 255 之间
  2482. 2. 掩码的二进制字符串前缀为网络号,都由‘1’组成;后缀为主机号,都由'0'组成
  2483. 输入描述:
  2484. 3行输入,第1行是输入子网掩码、第2,3行是输入两个ip地址
  2485. 题目的示例中给出了三组数据,但是在实际提交时,你的程序可以只处理一组数据(3行)。
  2486. 输出描述:
  2487. 若IP地址或子网掩码格式非法则输出1,若IP1与IP2属于同一子网络输出0,若IP1与IP2不属于同一子网络输出2
  2488. 示例1
  2489. 输入:
  2490. 255.255.255.0
  2491. 192.168.224.256
  2492. 192.168.10.4
  2493. 255.0.0.0
  2494. 193.194.202.15
  2495. 232.43.7.59
  2496. 255.255.255.0
  2497. 192.168.0.254
  2498. 192.168.0.1
  2499. 复制
  2500. 输出:
  2501. 1
  2502. 2
  2503. 0
  2504. 复制
  2505. 说明:
  2506. 对于第一个例子:
  2507. 255.255.255.0
  2508. 192.168.224.256
  2509. 192.168.10.4
  2510. 其中IP:192.168.224.256不合法,输出1
  2511. 对于第二个例子:
  2512. 255.0.0.0
  2513. 193.194.202.15
  2514. 232.43.7.59
  2515. 2个与运算之后,不在同一个子网,输出2
  2516. 对于第三个例子,2个与运算之后,如题目描述所示,在同一个子网,输出0
  2517. 相似企业真题
  2518. TOP
  2519. 2022年08月31日 16:52:13 星期三 */
  2520. int main39() {
  2521. int mask[4] = { 0 }, ip1[4] = { 0 }, ip2[4] = { 0 };
  2522. while (scanf_s("%d.%d.%d.%d", &mask[0], &mask[1], &mask[2], &mask[3]) != EOF) {
  2523. scanf_s("%d.%d.%d.%d", &ip1[0], &ip1[1], &ip1[2], &ip1[3]);
  2524. scanf_s("%d.%d.%d.%d", &ip2[0], &ip2[1], &ip2[2], &ip2[3]);
  2525. long long res = mask[0];
  2526. for (int i = 1; i < 4; i++) {
  2527. res = res*256+mask[i];
  2528. }
  2529. bitset<32> b(~res + 1);
  2530. if (b.count() != 1 || b == 1) {
  2531. cout << 1; //掩码非法
  2532. return 0;
  2533. }
  2534. for (int i = 0; i < 3; i++) {
  2535. if (ip1[i] < 0 || ip1[i]>255 || ip2[i] < 0 || ip2[i]>255) {
  2536. cout << 1; //ip非法
  2537. return 0;
  2538. }
  2539. }
  2540. for (int i = 0; i < 3 && mask[i]; i++) {
  2541. if (ip1[i] & mask[i] != ip2[i] & mask[i]) {
  2542. cout << 2; //非同一子网
  2543. return 0;
  2544. }
  2545. }
  2546. cout << 0;
  2547. return 0;
  2548. }
  2549. return 0;
  2550. }
  2551. /*
  2552. HJ40 统计字符
  2553. 题目
  2554. 题解(238)
  2555. 讨论(435)
  2556. 排行
  2557. 面经new
  2558. 简单 通过率:51.09% 时间限制:1秒 空间限制:32M
  2559. 知识点
  2560. 字符串
  2561. 哈希
  2562. warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
  2563. 描述
  2564. 输入一行字符,分别统计出包含英文字母、空格、数字和其它字符的个数。
  2565. 数据范围:输入的字符串长度满足 1 \le n \le 1000 \1≤n≤1000
  2566. 输入描述:
  2567. 输入一行字符串,可以有空格
  2568. 输出描述:
  2569. 统计其中英文字符,空格字符,数字字符,其他字符的个数
  2570. 示例1
  2571. 输入:
  2572. 1qazxsw23 edcvfr45tgbn hy67uj m,ki89ol.\\/;p0-=\\][
  2573. 复制
  2574. 输出:
  2575. 26
  2576. 3
  2577. 10
  2578. 12
  2579. 复制
  2580. 相似企业真题
  2581. TOP
  2582. 2022年08月31日 17:36:27 星期三
  2583. 2022年08月31日 17:39:44 星期三 (3)*/
  2584. int main() {
  2585. string s0;
  2586. int a = 0, s = 0, d = 0, o = 0;
  2587. getline(cin, s0);
  2588. for (char c : s0) {
  2589. if (isalpha(c)) {
  2590. a++;
  2591. }
  2592. else if (isspace(c)) {
  2593. s++;
  2594. }
  2595. else if (isdigit(c)) {
  2596. d++;
  2597. }
  2598. else {
  2599. o++;
  2600. }
  2601. }
  2602. cout << a << endl << s << endl << d << endl << o << endl;
  2603. return 0;
  2604. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/987453
推荐阅读