# ACM输出输出模板 + 练习(C++,Java,Python,go,JS)
很多录友苦于不熟悉 ACM 输⼊输⼊结构,在笔试和⾯试的时候,处理数据输⼊输出就花费了⼤量的时间,以⾄于算法题没写完,甚⾄是 根本就写不对输⼊输出的⽅式。
下⾯,我针对常⻅的25种 ACM输⼊与输出⽅式,给⼤家总结了模板写法,包括了C++、Java、Python、Go、JS等主流编程语⾔。
⼤家可以拿去直接“背诵”。
每种输⼊输出,都配套的对应的卡码⽹ (opens new window)练习题,每道题目我都给出练习题的链接。
注意本PDF只给出每种情况的ACM输⼊输出的模板写法,没有题⽬的完整代码,想看题⽬完整代码可以看卡码⽹题目的「评论区」
如果还没有掌握编程语⾔,可以报名卡码⽹的编程语⾔课 (opens new window)
ACM输出输出模版PDF下载 (opens new window)
# 1. 多行输入,每行两个整数
# C++
#include<iostream> using namespace std; int main() { int a, b; while (cin >> a >> b) cout << a + b << endl; }
2
3
4
5
6
# Java
import java.lang.*; import java.util.*; public class Main{ public static void main(String[] args){ Scanner in = new Scanner(System.in); while(in.hasNextInt()){ int a = in.nextInt(); int b = in.nextInt(); System.out.println(a+b); } } }
2
3
4
5
6
7
8
9
10
11
12
13
# Python
import sys # 接收输入 for line in sys.stdin: a, b = line.split(' ') # 输出 print(int(a) + int(b)) # 输出换行 print()
2
3
4
5
6
7
8
# Go
package main import "fmt" func main(){ var a, b int for { _, err := fmt.Scanf("%d %d",&a, &b) if err != nil { break } fmt.Println(a + b) } }
2
3
4
5
6
7
8
9
10
11
12
13
14
# JavaScript(Node)
// 引入readline模块来读取标准输入 const readline = require('readline'); // 创建readline接口 const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); // 处理输入和输出 function processInput() { rl.on('line', (input) => { // 将输入按空格分割成a和b的数组 const [a, b] = input.split(' ').map(Number); // 计算a和b的和并输出 const sum = a + b; console.log(sum); }); } // 开始处理输入 processInput();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 2. 多组数据,每组第一行为n, 之后输入n行两个整数
练习题:A+B问题II (opens new window)
# c++
#include<iostream> using namespace std; int main() { int n, a, b; while (cin >> n) { while (n--) { cin >> a >> b; cout << a + b << endl; } } }
2
3
4
5
6
7
8
9
10
11
# Java
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { int n = scanner.nextInt(); while (n-- > 0) { int a = scanner.nextInt(); int b = scanner.nextInt(); System.out.println(a + b); } } } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Python
while 1: try: N = int(input()) for i in range(N): l = list(map(int,input().split())) print(sum(l)) except: break
2
3
4
5
6
7
8
# Go
package main import "fmt" func main() { var n, a, b int for { _, err := fmt.Scan(&n) if err != nil { break } for n > 0 { _, err := fmt.Scan(&a, &b) if err != nil { break } fmt.Println(a + b) n-- } } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# JS
// 引入readline模块来读取标准输入 const readline = require("readline"); // 创建readline接口 const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); function processInput() { let pathArr = []; rl.on("line", (input) => { let path = input.split(" ").map(Number); // 将输入转为数组,根据length属性判断输入数字的个数 if (path.length == 1) { pathArr.push(path); } else { const [a, b] = path const sum = a + b; console.log(sum); } }); } processInput();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 3. 若干行输入,每行输入两个整数,遇到特定条件终止
练习题:A+B问题III (opens new window)
# c++
#include<iostream> using namespace std; int main() { int a, b; while (cin >> a >> b) { if (a == 0 && b == 0) break; cout << a + b << endl; } }
2
3
4
5
6
7
8
9
# Java
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { int a = scanner.nextInt(); int b = scanner.nextInt(); if (a == 0 && b == 0) { break; } System.out.println(a + b); } } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Python
import sys while True: s = input().split() # 一行一行读取 a, b = int(s[0]), int(s[1]) if not a or not b: # 遇到 0, 0 则中断 break print(a + b)
2
3
4
5
6
7
8
# Go
package main import "fmt" func main() { var a, b int for { _, err := fmt.Scan(&a, &b) if err != nil { break } if a == 0 && b == 0 { break } fmt.Println(a + b) } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# JavaScript
// 引入readline模块来读取标准输入 const readline = require('readline'); // 创建readline接口 const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); function preoceeInput() { rl.on('line', (input) => { const [a, b] = input.split(' ').map(Number); // # 遇到 0, 0 则中断 if (a === 0 && b === 0) { return; } else { console.log(a + b); } }); } preoceeInput()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 使用 Node.js 的 readline 模块来模拟 C++ 中的 cin 和 cout 操作 function main() { // 导入readline模块 const readline = require('readline'); // 创建readline接口 const rl = readline.createInterface({ input: process.stdin, // 从标准输入读取数据 output: process.stdout // 将输出写入标准输出 }); // 监听用户的输入事件 rl.on('line', (input) => { // 将输入拆分为两个数,并将其转换为数字 const [a, b] = input.split(' ').map(Number); // 判断输入的两个数是否都为0 if (a === 0 && b === 0) { rl.close(); // 如果是,则关闭输入流,结束程序 } else { console.log(a + b); // 否则,计算并输出两数之和 } }); } main(); // 调用主函数开始程序的执行
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 4. 若干行输入,遇到0终止,每行第一个数为N,表示本行后面有N个数
练习题:4. A + B问题IV (opens new window)
# c++
#include<iostream> using namespace std; int main(){ int n, a; while (cin >> n) { if (n == 0) break; // 计算累加值 int sum = 0; while (n--) { cin >> a; sum += a; } cout << sum << endl; } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Java
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { int n = scanner.nextInt(); if (n == 0) { break; } int sum = 0; for (int i = 0; i < n; i++) { sum += scanner.nextInt(); } System.out.println(sum); } } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Python
import sys for line in sys.stdin: nums = line.split() nums = list(map(int, nums)) n = nums[0] if not n: break print( sum(nums[-n:]) )
2
3
4
5
6
7
8
9
# Go
package main import "fmt" func main() { var n, a int for { _, err := fmt.Scan(&n) if err != nil { break } if n == 0 { break } sum := 0 for n > 0 { _, err := fmt.Scan(&a) if err != nil { break } sum += a n-- } fmt.Println(sum) } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# JavaScript(Node)
// 引入readline模块来读取标准输入 const readline = require('readline'); // 创建readline接口 const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); function preoceeInput() { rl.on('line', (input) => { // 读入每行数据,将其转换为数组 const line = input.split(' ').map(Number); // 判断读入的第一个数字是否为0 if (line[0] === 0) { return; } else { let sum = 0; for (let i = 1; i < line[0] + 1; i++) { sum += line[i]; } console.log(sum); } }); } preoceeInput()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 5. 若干行输入,每行包括两个整数a和b,由空格分隔,每行输出后接一个空行。
练习题:A+B问题 VII (opens new window)
# C++
#include<iostream> using namespace std; int main() { int a, b; while (cin >> a >> b) cout << a + b << endl << endl; }
2
3
4
5
6
# Java
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); while(sc.hasNextLine()){ int a = sc.nextInt(); int b = sc.nextInt(); System.out.println(a + b); System.out.println(); } } }
2
3
4
5
6
7
8
9
10
11
12
# Python
while True: try: x, y = map(int, (input().split())) print(x + y) print() except: break
2
3
4
5
6
7
# Go
package main import "fmt" func main() { var a, b int for { _, err := fmt.Scan(&a, &b) if err != nil { break } fmt.Printf("%d\n\n", a+b) } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Js
const readline=require('readline'); const rl=readline.createInterface({ input:process.stdin, output:process.stdout }); function Sum(){ rl.on("line",(input)=>{ const [a,b]=input.split(' ').map(Number); console.log(a+b+"\n"); }); } Sum();
2
3
4
5
6
7
8
9
10
11
12
# 6. 多组n行数据,每行先输入一个整数N,然后在同一行内输入M个整数,每组输出之间输出一个空行。
练习题:A+B问题 VIII (opens new window)
# c++
#include<iostream> using namespace std; int main() { int n, m, a; // 输入多组数据 while (cin >> n) { // 每组数据有n行 while(n--) { cin >> m; int sum = 0; // 每行有m个 while(m--) { cin >> a; sum += a; } cout << sum << endl; cout << endl; } } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Java
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); while(sc.hasNextLine()){ int N = sc.nextInt(); // 每组有n行数据 while(N-- > 0){ int M = sc.nextInt(); int sum = 0; // 每行有m个数据 while(M-- > 0){ sum += sc.nextInt(); } System.out.println(sum); if(N > 0) System.out.println(); } } } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Python
while 1: try: N = int(input()) for i in range(N): n = list(map(int, input().split())) if n[0] == 0: print() continue print(sum(n[1:])) if i<N-1: print() except: break
2
3
4
5
6
7
8
9
10
11
12
13
# Go
package main import "fmt" func main() { var N, M, num, sum int // 无限循环,直到没有更多的输入数据 for { // 尝试读取一组测试数据的数量 if _, err := fmt.Scan(&N); err != nil { break // 如果读取失败(例如,输入结束),则退出循环 } // 处理每一组测试数据 for i := 0; i < N; i++ { sum = 0 // 初始化当前组的数字和为0 fmt.Scan(&M) // 读取当前组的数字数量 // 读取并累加当前组的所有数字 for j := 0; j < M; j++ { fmt.Scan(&num) // 读取一个数字 sum += num // 将该数字加到总和中 } // 输出当前组的数字和 fmt.Println(sum) // 如果不是当前组的最后一个数字,输出一个空行 if i < N-1 { fmt.Println() } } } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# JavaScript
// 引入readline模块来读取标准输入 const readline = require('readline'); // 创建readline接口 const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); function preoceeInput() { let n; rl.on('line', (input) => { // 读入每行数据,将其转换为数组 const readline = input.split(' ').map(Number); if (readline.length === 1) { n = readline[0]; } else { let sum = 0; for (let i = 1; i < readline[0] + 1; i++) { sum += readline[i]; } if (n > 1) { console.log(sum + "\n"); n--; } else { // 如果是第n行 只输出结果不换行 console.log(sum); } } }); } preoceeInput()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 7. 多组测试样例,每组输入数据为字符串,字符用空格分隔,输出为小数点后两位
练习题:7. 平均绩点 (opens new window)
# c++
#include <iostream> using namespace std; int main() { string s; while (getline(cin, s)) { // 接受一整行字符串 for(int i = 0; i < s.size();i++) { // 遍历字符串 } } }
2
3
4
5
6
7
8
9
10
#include <iostream> #include <stdio.h> int main() { float sum = 10.0; int count = 4; printf("%.2f\n", sum / count); }
2
3
4
5
6
7
# Java
import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNextLine()) { String line = in.nextLine(); // 接收一整行字符串作为输入 String[] items = line.split(" "); // 字符串分割成数组 for (String item : items) { // 遍历数组 } } } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Main { public static void main(String[] args) { double avg = 3.25; System.out.printf("%.2f\n", avg); } }
2
3
4
5
6
# Python
while 1: try: n = input().replace(" ", "").replace("A", "4").replace("B", "3").replace("C", "2").replace("D", "1").replace( "F", "0") s = 0 for i in n: if i not in '43210': print('Unknown') break s += int(i) else: print(f"{s / len(n):.2f}") except: break
2
3
4
5
6
7
8
9
10
11
12
13
14
# Go
package main import( "bufio" "fmt" "os" "strings" ) func main(){ //创建一个bufio.Reader对象,用于从标准输入(即键盘)读取数据 reader := bufio.NewReader(os.Stdin) for{ s, _, err := reader.ReadLine() s_list := strings.Split(string(s), " ") //如果err的值不等于nil,则表示输入结束 if err != nil{ break } for i := 0; i < len(s_list); i++{ } } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
fmt.Println(fmt.Sprintf("%.2f", 3.14159))
# JavaScript(Node)
// 引入readline模块读取输入 const readline = require("readline"); // 创建readline接口 const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); function processInput() { rl.on("line", (input) => { let arr = input.split(" "); // 遍历 for (let i = 0; i < arr.length; i++) { } }); } processInput();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
let svg = 3.14159 console.log(svg.toFixed(2))
2
# 8. 多组测试用例,第一行为正整数n, 第二行为n个正整数,n=0时,结束输入,每组输出结果的下面都输出一个空行
练习题 8. 摆平积木 (opens new window)
# C++
#include<iostream> #include<vector> using namespace std; int main() { int n; while (cin >> n) { if (n == 0) break; // 创建vector vector<int> nums = vector<int>(n, 0); // 输入一组数据 for (int i = 0; i < n; i++) { cin >> nums[i]; } // 遍历 for (int i = 0; i < n; i++) { cout << nums[i]; } cout << result << endl; cout<< endl; } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Java
import java.util.ArrayList; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { Integer size = scanner.nextInt(); if (size == 0) { break; } // 创建list ArrayList<Integer> list = new ArrayList<>(); // 添加一组数据到list中 for (int i = 0; i < size; i++) { int num = scanner.nextInt(); list.add(num); } // 遍历 for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } System.out.println(res); System.out.println(); } } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# Python
while 1: try: n = int(input()) if n == 0: break ls = list(map(int, input().split())) # 遍历 for i in ls: #操作 print(moves//2) print() except: break
2
3
4
5
6
7
8
9
10
11
12
13
# Go
package main import ( "fmt" ) func main() { var n int for { _, err := fmt.Scanf("%d", &n) if err != nil || n == 0 { break } nums := make([]int, n) for i := 0; i < n; i++ { // 读取一个整数,存放在数组中 fmt.Scanf("%d", &nums[i]) } for i := 0; i < n; i++ { fmt.Println(nums[i]) } fmt.Println(result) fmt.Println() } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# Js
const rl = require("readline").createInterface({ input: process.stdin }); var iter = rl[Symbol.asyncIterator](); const readline = async () => (await iter.next()).value; void (async function () { while ((line = await readline())) { // 读取输入数组长度 let size = parseInt(line) if(size == 0) break let input = await readline() // 将输入的数字转换成整数数组 let arr = input.split(" ").map(Number); // 遍历数组 for (let i = 0; i < size; i++) { // arr[i] } console.log(res); console.log(); } })();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 9. 多组测试数据,每组数据只有一个整数,对于每组输入数据,输出一行,每组数据下方有一个空行。
练习题:9. 奇怪的信 (opens new window)
# c++
#include<iostream> using namespace std; int main() { int n, a; while (cin >> n) { while (n != 0) { a = (n % 10); // 获取各位数据 n = n / 10; } cout << result << endl; cout << endl; } }
2
3
4
5
6
7
8
9
10
11
12
13
# Java
import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNextInt()) { int n = in.nextInt(); while (n > 0) { int tmp = n % 10; // 获取各位数据 n /= 10; } System.out.println(res); System.out.println(); } } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Python
while 1: try: n=input() s=0 for i in n: print(int(i)) print(s) print() except: break
2
3
4
5
6
7
8
9
10
# Go
package main import ( "fmt" ) func main() { var n, a int for { _, err := fmt.Scanf("%d", &n) if err != nil || n == 0 { break } for n != 0 { a = n % 10 n = n / 10 } fmt.Println(result) fmt.Println() } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# JS
const readline = require("readline"); const r1 = readline.createInterface({ input: process.stdin, output: process.stdout, }); const iter = r1[Symbol.asyncIterator](); const read_line = async () => (await iter.next()).value; let line = null; (async function () { while ((line = await read_line())) { const arr = line.split("").map((item) => Number(item)); for (let i = 0; i < arr.length; i++) { } console.log(sum, "\n"); } })();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 10. 多组测试数据,每个测试实例包括2个整数M,K(2<=k<=M<=1000)。M=0,K=0代表输入结束。
练习题 10. 运营商活动 (opens new window)
# C++
#include<iostream> using namespace std; int main() { int m, k; while (cin >> m >> k) { if (m == 0 && k == 0) break; int sum = m + m / k; // 第一轮回得到总话费 cout << sum << endl; } }
2
3
4
5
6
7
8
9
10
11
# Java
import java.util.*; public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNextInt()) { int m = sc.nextInt(); int k = sc.nextInt(); if (m == 0 && k == 0) break; int sum = 0; System.out.println(sum); } } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Python
while True: M, K = map(int, input().split()) if M == 0 and K == 0: break res = M print(res)
2
3
4
5
6
# JS
const readline = require("readline"); const r1 = readline.createInterface({ input: process.stdin, output: process.stdout, }); const iter = r1[Symbol.asyncIterator](); const read_line = async () => (await iter.next()).value; let line = null; (async function () { while ((line = await read_line())) { const [m, k] = line.split("").map((item) => Number(item)); if (m === 0 && k === 0) { break; } let sum = 0; console.log(sum, "\n"); } })();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Go
package main import ( "fmt" ) func main() { var m, k int for { _, err := fmt.Scanf("%d %d", &m, &k) if err != nil || (m == 0 && k == 0) { break } sum := m + m/k fmt.Println(sum) } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 11. 多组测试数据,首先输入一个整数N,接下来N行每行输入两个整数a和b, 读取输入数据到Map
练习题 11. 共同祖先 (opens new window)
# C++
#include<iostream> #include<vector> using namespace std; int main() { int n, a, b; vector<int> nums = vector<int>(30, 0); // 使用数组来记录映射关系,初始化为0 while (cin >> n) { while (n--) { cin >> a >> b; nums[a] = b; // 记录映射关系 } } }
2
3
4
5
6
7
8
9
10
11
12
13
# Java
import java.util.*; public class Main{ static Map<Integer, Integer> map = new HashMap(); public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNextInt()) { int n = sc.nextInt(); for (int i = 0; i < n; i++) { int a = sc.nextInt(); int b = sc.nextInt(); map.put(a, b); } } } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Python
while True: try: N = int(input()) myMap = {} for _ in range(N): a, b = map(int, input().split()) myMap[a] = b except: break
2
3
4
5
6
7
8
9
# Js
// 引入readline模块来读取标准输入 const readline = require('readline') // 创建readline接口 const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); let myMap = new Array(21).fill(0) let n rl.on('line', (input) => { // 读入每行数据,将其转换为数组 const readline = input.split(' ').map(Number) if (readline.length === 1) { n = readline[0] } else { const [a, b] = readline myMap[a] = b n-- } });
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Go
package main import ( "fmt" ) func main() { var n, a, b int nums := make([]int, 30) for { _, err := fmt.Scanf("%d", &n) if err != nil { break } for i := 0; i < n; i++ { fmt.Scanf("%d %d", &a, &b) // 将输入数据放到map中 nums[a] = b } } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 12. 多组测试数据。每组输入一个整数n,输出特定的数字图形
练习题 12. 打印数字图形 (opens new window)
# C++
#include<iostream> #include<vector> using namespace std; void printTopPart(int n) { for (int i = 1; i <= n; i++) { // 打印空格 for (int j = 1; j <= n - i; ++j) { cout << " "; } // 打印递增数字 for (int j = 1; j <= i; j++) { cout << j; } // 打印递减数字 for (int j = i - 1; j >= 1; j--) { cout << j; } cout << endl; } } int main() { int n; while (cin >> n) { if (n < 1 || n > 9) { cout << "输入的整数n超出范围" << endl; } printTopPart(n); } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# Java
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { int n = scanner.nextInt(); for (int i = 1; i <= n; i++) { print(n - i, i); } for (int i = n - 1; i >= 1; i--) { print(n - i, i); } } } public static void print(int blank, int n) { // 前面需要补齐空格 for (int i = 0; i < blank; i++) { System.out.print(" "); } for (int i = 1; i <= n; i++) { System.out.print(i); } for (int i = n - 1; i > 0; i--) { System.out.print(i); } System.out.println(); } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# Python
while True: try: n = int(input()) for i in range(1, n + 1): print(' ' * (n - i), end='') print(''.join(map(str, range(1, i + 1))) + ''.join(map(str, range(i - 1, 0, -1)))) for i in range(n - 1, 0, -1): print(' ' * (n - i), end='') print(''.join(map(str, range(1, i + 1))) + ''.join(map(str, range(i - 1, 0, -1)))) except: break
2
3
4
5
6
7
8
9
10
11
# Go
package main import "fmt" func printTopPart(n int) { for i := 1; i <= n; i++ { // 打印空格 for j := 1; j <= n-i; j++ { fmt.Print(" ") } // 打印递增数字 for j := 1; j <= i; j++ { fmt.Print(j) } // 打印递减数字 for j := i - 1; j >= 1; j-- { fmt.Print(j) } fmt.Println() } } func main() { var n int for { _, err := fmt.Scan(&n) if err != nil { break } if n < 1 || n > 9 { fmt.Println("输入的整数n超出范围") continue } printTopPart(n) } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# JS
function printTopPart(n) { for (let i = 1; i <= n; i++) { // 打印空格 for (let j = 1; j <= n - i; ++j) { process.stdout.write(" "); } // 打印递增数字 for (let j = 1; j <= i; j++) { process.stdout.write(String(j)); } // 打印递减数字 for (let j = i - 1; j >= 1; j--) { process.stdout.write(String(j)); } console.log(); } } function main() { const readline = require('readline'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); rl.on('line', (input) => { let n = parseInt(input); if (n < 1 || n > 9) { console.log("输入的整数n超出范围"); } printTopPart(n); }); } main();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 13. 多行输入,每行输入为一个字符和一个整数,遇到特殊字符结束
练习题 13. 镂空三角形 (opens new window)
# C++
int main() { char c; int n; while(cin >> c){ if(c == '@') break; cin >> n; myprint(c, n); } return 0; }
2
3
4
5
6
7
8
9
10
11
# Java
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { String line = sc.nextLine(); if (line.equals("@")) break; String[] inputs = line.split(" "); char ch = inputs[0].charAt(0); int n = Integer.parseInt(inputs[1]); } sc.close(); } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Python
while True: try: line = input() if line == '@': break ch, n = line.split() n = int(n) except:
2
3
4
5
6
7
8
# Go
package main import ( "fmt" ) func main() { var n int var a rune for { _, err := fmt.Scanf("%c", &a) if err != nil || a == '@' { break } _, err = fmt.Scanf("%d", &n) if err != nil { break } } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Js
function main() { const readline = require('readline'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); rl.on('line', (input) => { let [c, n] = input.split(' '); if (c === '@') { rl.close(); // 结束输入监听 return; } myprint(c, parseInt(n)); }); } main();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 14. 第一行是一个整数n,表示一共有n组测试数据, 之后输入n行字符串
练习题 14. 句子缩写 (opens new window)
# c++
#include<iostream> #include<string> using namespace std; int main() { int n; string result, s; cin >> n; getchar(); // 吸收一个回车,因为输入n之后,要输入一个回车 while (n--) { getline(cin, s); for (int i = 1; i < s.size() - 1; i++) { } cout << result << endl; } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Java
import java.util.*; public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNextInt()) { int n = sc.nextInt(); sc.nextLine(); for (int i = 0; i < n; i++) { String line = sc.nextLine().trim(); StringBuilder sb = new StringBuilder(); System.out.println(sb.toString()); } } } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner in = new Scanner(System.in); int n=in.nextInt(); in.nextLine(); for (int j = 0; j < n; j++) { String s=in.nextLine(); StringBuilder sb=new StringBuilder(); System.out.println(sb.toString().toUpperCase()); } } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Python
T = int(input()) for _ in range(T): words = input().split() for word in words:
2
3
4
5
# Go
package main import ( "bufio" "fmt" "os" "strings" ) func main() { var n int _, err := fmt.Scan(&n) if err != nil { return } scanner := bufio.NewScanner(os.Stdin) for i := 0; i < n && scanner.Scan(); i++ { input := scanner.Text() words := strings.Fields(input) for _, word := range words { } } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# Js
const rl=require("readline").createInterface({input:process.stdin}); const iter=rl[Symbol.asyncIterator](); const readline=async ()=>(await iter.next()).value; async function main(){ const n=parseInt(await readline()); for(let i=0;i<n;i++){ let line=await readline(); let words=line.split(/\s+/); words.forEach(item=>{ process.stdout.write() }); console.log(); } } main();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 15. 第一行是一个整数n,然后是n组数据,每组数据2行,每行为一个字符串,为每组数据输出一个字符串,每组输出占一行
练习题 15.神秘字符 (opens new window)
# C++
#include<iostream> #include<string> using namespace std; int main() { int n; cin >> n; getchar(); // 吸收n后的一个回车 while (n--) { string s, t; cin >> s >> t; string result = ""; cout << result << endl; } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Java
import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); for (int i = 0; i < n; i++) { String a = in.next(); String b = in.next(); StringBuilder sb = new StringBuilder(a); System.out.println(sb.toString()); } } }
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String str = null; while((str = reader.readLine())!= null){ StringTokenizer tokenizer = new StringTokenizer(str); int n = Integer.parseInt(tokenizer.nextToken()); for(int i = 0; i < n; i++){ String a = reader.readLine(); String b = reader.readLine(); StringBuilder sb = new StringBuilder(); System.out.println(sb.toString()); } } } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Python
n = int(input()) for _ in range(n): line1 = input() line2 = input() mid = len(line1) // 2 result = line1[:mid] + line2 + line1[mid:] print(result)
2
3
4
5
6
7
# Go
package main import "fmt" func main() { var n int _, err := fmt.Scan(&n) if err != nil { return } for n > 0 { var a, b string _, _ = fmt.Scanln(&a) _, _ = fmt.Scanln(&b) fmt.Println(a[:len(a)/2] + b + a[len(a)/2:]) n-- } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# JS
const rl=require("readline").createInterface({input:process.stdin}); const iter=rl[Symbol.asyncIterator](); const readline=async ()=>(await iter.next()).value; async function main(){ const n=parseInt(await readline()); for(let i=0;i<n;i++){ let str1=await readline(); let str2=await readline(); console.log(); } } main();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 16. 多组测试数据,第一行是一个整数n,接下来是n组字符串,输出字符串
练习题:16. 位置互换 (opens new window)
# C++
#include<iostream> #include<string> using namespace std; int main() { int n; cin >> n; string s; while (n--) { cin >> s; cout << s << endl; } }
2
3
4
5
6
7
8
9
10
11
12
13
14
# Java
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String str = null; while((str = reader.readLine())!= null){ StringTokenizer tokenizer = new StringTokenizer(str); int n = Integer.parseInt(tokenizer.nextToken()); for(int i = 0; i < n; i++){ String s = reader.readLine(); StringBuilder sb = new StringBuilder(); System.out.println(sb.toString()); } } } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 方法二:原地交换 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); sc.nextLine(); for (int i = 0; i < n; i++) { String s1 = sc.nextLine(); int len = s1.length(); char[] chs = s1.toCharArray(); System.out.println(new String(chs)); } sc.close(); } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Python
C = int(input()) for _ in range(C): s = input() print(result)
2
3
4
5
# Go
package main import ( "fmt" ) func main() { var n int _, err := fmt.Scanf("%d", &n) if err != nil { return } for i := 0; i < n; i++ { var s string _, err = fmt.Scanf("%s", &s) if err != nil { return } fmt.Println(s) } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Js
const rl=require("readline").createInterface({input:process.stdin}); const iter=rl[Symbol.asyncIterator](); const readline=async ()=>(await iter.next()).value; async function main(){ let n=parseInt(await readline()); for(let i=0;i<n;i++){ let str=await readline(); console.log(); } } main();
2
3
4
5
6
7
8
9
10
11
12
13
# 17. 多组测试数据,每组测试数据的第一行为整数N(1<=N<=100),当N=0时,输入结束,第二行为N个正整数,以空格隔开,输出结果为字符串
练习题:17. 出栈合法性 (opens new window)
# C++
#include<iostream> #include<stack> #include<vector> using namespace std; int main() { int n; int nums[105]; while(cin >> n) { // 结束输入 if (n == 0) break; for (int index = 0; index < n; index++) cin >> nums[index]; // 输入数组 stack<int> st; int index = 0; // 输出字符串 if (st.empty() && index == n) cout << "Yes" << endl; else cout << "No" << endl; } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Java
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String str = null; while((str = reader.readLine())!= null){ StringTokenizer tokenizer = new StringTokenizer(str); // 读取n int n = Integer.parseInt(tokenizer.nextToken()); if(n == 0){ break; } int[] arr = new int[n]; tokenizer = new StringTokenizer(reader.readLine()); // 读取n个正整数 for(int i = 0; i < n; i++){ arr[i] = Integer.parseInt(tokenizer.nextToken()); } if(check(arr)){ System.out.println("Yes"); }else{ System.out.println("No"); } } } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 方法二:使用栈模拟 import java.util.Scanner; import java.util.Stack; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (true) { int n = sc.nextInt(); if (n == 0) break; Stack<Integer> stack = new Stack<>(); for (int i = 0; i < n; i++) stack.push(sc.nextInt()) } if (isValidPopSequence(n, poppedSequence)) System.out.println("Yes"); else System.out.println("No"); } sc.close(); } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# Python
while True: n = int(input()) if n == 0: break sequence = list(map(int, input().split())) stack = [] possible = True for num in sequence: stack.append(num) if possible: print('Yes') else: print('No')
2
3
4
5
6
7
8
9
10
11
12
13
# Go
package main import ( "fmt" ) func main() { for { var n int _, _ = fmt.Scan(&n) if n == 0 { break } nums := make([]int, n) for i := 0; i < n; i++ { _, _ = fmt.Scan(&nums[i]) } stack := make([]int, 0) for i := 1; i <= n; i++ { stack = append(stack, nums[i]) } } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# JS
const readline = require('readline') const rl = readline.createInterface({ input: process.stdin, output: process.stdout }) // 因为只能一行一行地读取数据,所以用-1来表示是否是一组新的数据 let n = -1 rl.on('line', (input) => { line = input.split(' ').map(Number) if (line.length === 1 && n === -1) { // 如果是一组新的数据,先读入n,直接return等待下一次输入 n = line[0] return } // line保存的是出栈序列 if (islegal(line, n)) { console.log('Yes') } else { console.log('No') } // 处理完一组数据后,写回n = -1 n = -1 })
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 18. 一组输入数据,第一行为n+1个整数,逆序插入n个整数,第二行为一个整数m, 接下来有m行字符串,并根据字符串内容输入不同个数的数据
练习题:18. 链表的基本操作 (opens new window)
# c++
int main() { int n, a, m, t, z; string s; cin >> n; while (n--) { cin >> a; } cin >> m; while (m--) { // 输入m个字符串,根据字符串内容输出 cin >> s; if (s == "show") { cout << "Link list is empty" << endl; } if (s == "delete") { cin >> t; // 本题的删除索引是从1开始,函数实现是从0开始,所以这里是 t - 1 if (deleteAtIndex(t - 1) == -1) cout << "delete fail" << endl; else cout << "delete OK" << endl; } if (s == "insert") { cin >> t >> z; if (addAtIndex(t - 1, z) == -1) cout << "insert fail" << endl; else cout << "insert OK" << endl; } if (s == "get") { cin >> t; int getValue = get(t - 1); if (getValue == -1) cout << "get fail" << endl; else cout << getValue << endl; } } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# Java
public static void main(String[] args) { Scanner sc = new Scanner(System.in); // 输入n int n = sc.nextInt(); // 输入n个整数 for (int i = 0; i < n; i++) { int num = sc.nextInt(); linkedList.addFirst(num); } // 输入m int m = sc.nextInt(); // 输入m个字符串 for (int i = 0; i < m; i++) { // 获取输入的字符串 String operation = sc.next(); // 根据输入内容,给出不同输出结果 if ("get".equals(operation)) { int a = sc.nextInt(); int result = linkedList.get(a - 1); if (result != -1) { System.out.println(result); } else { System.out.println("get fail"); } } else if ("delete".equals(operation)) { int a = sc.nextInt(); boolean deleteResult = linkedList.delete(a - 1); if (deleteResult) { System.out.println("delete OK"); } else { System.out.println("delete fail"); } } else if ("insert".equals(operation)) { int a = sc.nextInt(); int e = sc.nextInt(); boolean insertResult = linkedList.insert(a - 1, e); if (insertResult) { System.out.println("insert OK"); } else { System.out.println("insert fail"); } } else if ("show".equals(operation)) { linkedList.show(); } } sc.close(); }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# Python
if __name__ == "__main__": while True: mylinklist = MyLinkedList() try: # 读取链表长度和链表数值 n, *nums = list(map(int, input().split())) # 初始化链表 for i in range(n): mylinklist.addAtHead(nums[i]) # 读取操作的个数 m = int(input()) for i in range(m): # 读取输入的操作和对应的索引 s = input().split() if s[0] == "show": if mylinklist.printLinkedList() == -1: print("Link list is empty") if s[0] == "delete": t = int(s[1]) if mylinklist.deleteAtIndex(t - 1) == -1: print("delete fail") else: print("delete OK") if s[0] == "insert": t = int(s[1]) z = int(s[2]) if mylinklist.addAtIndex(t - 1, z) == -1: print("insert fail") else: print("insert OK") if s[0] == "get": t = int(s[1]) getValue = mylinklist.get(t - 1) if getValue == -1: print("get fail") else: print(getValue) except: break
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# Go
func main() { var n int // 输入n _, err := fmt.Scan(&n) if err != nil { return } list := Constructor() // 输入n个数据 for i := 0; i < n; i++ { var data int _, err = fmt.Scan(&data) if err != nil { return } list.insert(1, data) } var m int //输入m _, err = fmt.Scan(&m) if err != nil { return } // 输入m行字符串 for i := 0; i < m; i++ { var s string _, err = fmt.Scan(&s) if err != nil { return } // 根据字符串操作输出 switch s { case "get": var index int _, err = fmt.Scan(&index) if err != nil { return } val, err := list.get(index) if err != nil { fmt.Println(err.Error()) } else { fmt.Println(val) } case "delete": var index int _, err = fmt.Scan(&index) if err != nil { return } err := list.delete(index) if err != nil { fmt.Println(err.Error()) } else { fmt.Println("delete OK") } case "insert": var index, val int _, err = fmt.Scan(&index, &val) if err != nil { return } if err = list.insert(index, val); err != nil { fmt.Println(err.Error()) } else { fmt.Println("insert OK") } case "show": list.Show() } } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# Javascript
const rl=require("readline").createInterface({input:process.stdin}); const iter=rl[Symbol.asyncIterator](); const readline=async ()=>(await iter.next()).value; const out=process.stdout; async function main(){ const nums=(await readline()).split(" ").map(Number); let root=new Node(-1); for(let i=1;i<=nums[0];i++){ root.insert(1,nums[i]); } const n=parseInt(await readline()); let index; for(let i=0;i<n;i++){ let line=(await readline()).split(" "); let op=line[0]; let flag=false; switch(op){ case "show": root.show(); break; case "get": index=parseInt(line[1]); let node=root.getNode(index); if(node) out.write(node.data.toString()); else out.write("get fail"); break; case "delete": index=parseInt(line[1]); flag=root.deleteNode(index); if(flag) out.write("delete OK"); else out.write("delete fail"); break; case "insert": index=parseInt(line[1]); flag=root.insert(index,parseInt(line[2])); if(flag) out.write("insert OK"); else out.write("insert fail"); break; } console.log(); } } main();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 19. 多组测试数据,每行为n+1个数字, 输出链表或对应的字符串
练习题:19. 单链表反转 (opens new window)
练习题:20. 删除重复元素 (opens new window)
# C++
int main() { int n, m; LinkedNode* dummyHead = new LinkedNode(0); // 这里定义的头结点 是一个虚拟头结点,而不是真正的链表头结点 while (cin >> n) { if (n == 0) { cout << "list is empty" << endl; continue; } LinkedNode* cur = dummyHead; // 读取输入构建链表 while (n--) { cin >> m; LinkedNode* newNode = new LinkedNode(m); // 开始构造节点 cur->next = newNode; cur = cur->next; } printLinkedList(dummyHead->next); printLinkedList(reverseList(dummyHead->next)); } } // 输出链表 void printLinkedList(LinkedNode* head) { LinkedNode* cur = head; while (cur != nullptr) { cout << cur->val << " "; cur = cur->next; } cout << endl; }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# Java
import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNextLine()) { String[] str = sc.nextLine().split(" "); if (Integer.parseInt(str[0]) == 0) { System.out.println("list is empty"); } ListNode dummyhead = new ListNode(-1); ListNode cur = dummyhead; //构造链表 for (int i = 1; i < str.length; i++) { ListNode temp = new ListNode(Integer.parseInt(str[i])); cur.next = temp; cur = cur.next; if (i == str.length - 1) cur.next = null; } //输出原链表 ListNode pointer = dummyhead.next; while (pointer != null) { System.out.print(pointer.val + " "); pointer = pointer.next; } System.out.println(); } } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# python
# 打印链表 def printLinkedList(head: LinkedNode): cur = head while cur: print(cur.val, end = " ") cur = cur.next print() if __name__ == "__main__": while True: try: # 输入5 1 2 3 4 5,表示链表有5个节点,值分别为1 2 3 4 5 n, *nums = map(int, input().split()) except: break if n == 0: print("list is empty") continue dummyHead = LinkedNode(0) # 这里定义的头结点 是一个虚拟头结点,而不是真正的链表头结点 cur = dummyHead for i in range(n): # 开始构造节点 cur.next = LinkedNode(nums[i]) cur = cur.next printLinkedList(dummyHead.next) # 打印链表 printLinkedList(reverseList(dummyHead.next)) # 打印翻转后的链表
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# Go
func main() { for { var n int _, err := fmt.Scan(&n) if err != nil { return } if n == 0 { fmt.Println("list is empty") continue } // 构建链表 dummyHead := &Node{} cur := dummyHead for n > 0 { var val int _, err = fmt.Scan(&val) if err != nil { return } node := &Node{val: val} cur.next = node cur = cur.next n-- } show(dummyHead.next) } } // 输出链表 func show(head *Node) { if head == nil { return } cur := head for { fmt.Printf("%d ", cur.val) cur = cur.next if cur == nil { fmt.Println() return } } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# Js
// 引入readline模块来读取标准输入 const readline = require('readline') // 创建readline接口 const rl = readline.createInterface({ input: process.stdin, output: process.stdout }) // 处理输入和输出 rl.on('line', (input) => { // 将每一行以空格分割成一个字符串数组,并将每个元素转换成number类型 const line = input.split(' ').filter(item => item !== '').map(Number) // 第一个元素是链表长度 const n = line[0] // 长度为0,直接输出 list is empty if (n === 0) { console.log('list is empty') return } // 根据给定输入创建链表 let head = createLinkedList(line.slice(1)) // 打印翻转前的链表 printLinkedList(head) }) // 给定一个number数组,创建出链表,返回链表的头节点 function createLinkedList(arr) { // 创建头节点 const head = new Node(arr[0]) // 初始化尾指针,方便添加新的节点 let tail = head arr.slice(1).forEach(item => { // 每次将细节点插在尾节点后面 tail.next = new Node(item) // 更新尾节点为新创建的节点 tail = tail.next }) // 返回头节点 return head } // 输出链表 function printLinkedList(head) { let output = '' // 将每个节点的val拼接成一个字符串 while(head) { output += `${head.val} ` head = head.next } // 最后输出 console.log(output) }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# 20. 多组输入,每组输入包含两个字符串,输出字符串
练习题:21. 构造二叉树 (opens new window)
# C++
int main() { string s; while (getline(cin, s)) { // 接受一整行字符串 string preorder = "", inorder = ""; // 拆分出两个字符串 int i; for (i = 0; s[i] != ' '; i++) preorder += s[i]; i++; for (; i < s.size(); i++) inorder += s[i]; // 开始构造二叉树 TreeNode* root = buildTree(preorder, inorder); // 输出后序遍历结果 postorderTraversal(root); cout << endl; } return 0; } // 后序遍历二叉树 void postorderTraversal(TreeNode* root) { if (root == nullptr) { return; } postorderTraversal(root->left); postorderTraversal(root->right); cout << root->val; }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# Java
public class Main{ public static Map<Character, Integer> map = new HashMap(); public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNextLine()) { String s = sc.nextLine(); String[] ss = s.split(" "); String pre = ss[0]; String in = ss[1]; // 构建二叉树 TreeNode res = afterHelper(pre.toCharArray(), in.toCharArray()); //打印二叉树 printTree(res); System.out.println(); } } public static void printTree(TreeNode root) { if (root == null) return; printTree(root.left); printTree(root.right); System.out.print(root.val); } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# Python
def postorder_traversal(root): if not root: return [] left = postorder_traversal(root.left) right = postorder_traversal(root.right) return left + right + [root.val] while True: try: preorder, inorder = map(str, input().split()) if not preorder or not inorder: break root = build_tree(preorder, inorder) postorder = postorder_traversal(root) print(''.join(postorder)) except EOFError: break
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Go
package main import ( "fmt" "strings" ) func main() { for { var preorder, inorder string _, err := fmt.Scan(&preorder, &inorder) if err != nil { return } tree := buildTree(preorder, inorder, 0, len(preorder)-1, 0, len(inorder)-1) fmt.Println(postorderTraversal(tree)) } } // 后序遍历结果 func postorderTraversal(root *TreeNode) string { var res []string var traversal func(node *TreeNode) traversal = func(node *TreeNode) { if node == nil { return } traversal(node.Left) traversal(node.Right) res = append(res, node.Val) } traversal(root) return strings.Join(res, "") }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# JS
const rl=require("readline").createInterface({input:process.stdin}); const iter=rl[Symbol.asyncIterator](); const readline=async ()=>(await iter.next()).value; const out=process.stdout; class Node{ constructor(data){ this.data=data; this.left=null; this.right=null; } postOrder(){ if(this.left!=null) this.left.postOrder(); if(this.right!=null) this.right.postOrder(); out.write(this.data); } } async function main(){ while(line=await readline()){ [preOrder,inOrder]=line.split(" "); const root=createBTree(preOrder,inOrder,0,preOrder.length-1,0,inOrder.length-1); // 获取后序遍历 root.postOrder(); console.log(); } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 21. 一组多行数据,第一行为数字n, 表示后面有n行,后面每行为1个字符加2个整数,输出树节点的后序遍历字符串
练习题:22. 二叉树的遍历 (opens new window)
# C++
#include <iostream> #include <unordered_map> #include <vector> using namespace std; // 前序遍历二叉树 void preorderTraversal(TreeNode* root) { if (root == nullptr) { return; } cout << root->val; preorderTraversal(root->left); preorderTraversal(root->right); } // 中序遍历二叉树 void inorderTraversal(TreeNode* root) { if (root == nullptr) { return; } inorderTraversal(root->left); cout << root->val; inorderTraversal(root->right); } // 后序遍历二叉树 void postorderTraversal(TreeNode* root) { if (root == nullptr) { return; } postorderTraversal(root->left); postorderTraversal(root->right); cout << root->val; } int main() { int n; cin >> n; unordered_map<char, std::pair<char, char>> nodeMap; // 先保存输入的数据 vector<char> index = vector<char>(n + 1, '0'); vector<vector<int>> nums = vector<vector<int>>(n + 1, vector<int>(2, 0)); for (int i = 1; i <= n; i++) { cin >> index[i] >> nums[i][0] >> nums[i][1]; } // 输出 preorderTraversal(root); cout << std::endl; inorderTraversal(root); cout << std::endl; postorderTraversal(root); cout << std::endl; return 0; }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# Java
import java.util.*; class TreeNode { char val; TreeNode left; TreeNode right; public TreeNode(char val) { this.val = val; } } public class Main{ static TreeNode[] nodes = new TreeNode[30]; public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNextInt()) { int len = sc.nextInt(); for (int i = 0; i < len; i++) { // 获取字符和左右子节点 char val = sc.next().charAt(0); int left = sc.nextInt(); int right = sc.nextInt(); } preorder(nodes[1]); System.out.println(); inorder(nodes[1]); System.out.println(); postorder(nodes[1]); System.out.println(); } } public static void preorder(TreeNode root) { if (root == null) return; System.out.print(root.val); preorder(root.left); preorder(root.right); } public static void inorder(TreeNode root) { if (root == null) return; inorder(root.left); System.out.print(root.val); inorder(root.right); } public static void postorder(TreeNode root) { if (root == null) return; postorder(root.left); postorder(root.right); System.out.print(root.val); } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// 方法二:使用索引,简化构建树的过程 import java.util.Scanner; public class Main { static class TreeNode { char val; int left; int right; public TreeNode(char val, int left, int right) { this.val = val; this.left = left; this.right = right; } } static TreeNode[] nodes; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); nodes = new TreeNode[n + 1]; for (int i = 0; i < n; i++) { char val = sc.next().charAt(0); int left = sc.nextInt(); int right = sc.nextInt(); nodes[i + 1] = new TreeNode(val, left, right); } preOrderTraversal(1); System.out.println(); inOrderTraversal(1); System.out.println(); postOrderTraversal(1); System.out.println(); sc.close(); } private static void postOrderTraversal(int root) { if (root == 0) return; postOrderTraversal(nodes[root].left); postOrderTraversal(nodes[root].right); System.out.print(nodes[root].val); } private static void inOrderTraversal(int root) { if (root == 0) return; inOrderTraversal(nodes[root].left); System.out.print(nodes[root].val); inOrderTraversal(nodes[root].right); } private static void preOrderTraversal(int root) { if (root == 0) return; System.out.print(nodes[root].val); preOrderTraversal(nodes[root].left); preOrderTraversal(nodes[root].right); } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# Go
package main import ( "fmt" "strings" ) func preorder(root *Node) []string { if root == nil { return []string{} } left := preorder(root.Left) right := preorder(root.Right) return append([]string{root.Val}, append(left, right...)...) } func inorder(root *Node) []string { if root == nil { return []string{} } left := inorder(root.Left) right := inorder(root.Right) return append(append(left, root.Val), right...) } func postorder(root *Node) []string { if root == nil { return []string{} } left := postorder(root.Left) right := postorder(root.Right) return append(append(left, right...), root.Val) } func main() { var n int fmt.Scan(&n) nodes := make([]*Node, n+1) var line string for i := 0; i < n; i++ { fmt.Scan(&line) val := line[0:1] left, right := 0, 0 fmt.Scan(&left, &right) } root := nodes[1] pre := preorder(root) ino := inorder(root) post := postorder(root) fmt.Println(strings.Join(pre, "")) fmt.Println(strings.Join(ino, "")) fmt.Println(strings.Join(post, "")) }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# Python
def preorder(root): if not root: return [] left = preorder(root.left) right = preorder(root.right) return [root.val] + left + right def inorder(root): if not root: return [] left = inorder(root.left) right = inorder(root.right) return left + [root.val] + right def postorder(root): if not root: return [] left = postorder(root.left) right = postorder(root.right) return left + right + [root.val] n = int(input()) nodes = [None] * (n + 1) line_in = [] for i in range(n): line = input().split() val, left, right = line[0], int(line[1]), int(line[2]) root = nodes[1] pre = preorder(root) ino = inorder(root) post = postorder(root) print(''.join(pre)) print(''.join(ino)) print(''.join(post))
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# JS
const rl=require("readline").createInterface({input:process.stdin}); const iter=rl[Symbol.asyncIterator](); const readline=async ()=>(await iter.next()).value; const out=process.stdout; class Node{ nodes=new Array(); constructor(data,left,right){ this.data=data; this.left=left; this.right=right; } preOrder(){ out.write(this.data); if(this.left!==0) Node.nodes[this.left].preOrder(); if(this.right!==0) Node.nodes[this.right].preOrder(); } inOrder(){ if(this.left!==0) Node.nodes[this.left].inOrder(); out.write(this.data); if(this.right!==0) Node.nodes[this.right].inOrder(); } postOrder(){ if(this.left!==0) Node.nodes[this.left].postOrder(); if(this.right!==0) Node.nodes[this.right].postOrder(); out.write(this.data); } } async function main(){ const n=parseInt(await readline()); Node.nodes=new Array(n+1); for(let i=1;i<=n;i++){ let line=(await readline()).split(" "); let left=parseInt(line[1]); let right=parseInt(line[2]); Node.nodes[i]=new Node(line[0],left,right); } Node.nodes[1].preOrder(); console.log(); Node.nodes[1].inOrder(); console.log(); Node.nodes[1].postOrder(); } main();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# 22. 多组测试数据,首先给出正整数N,接着输入两行字符串,字符串长度为N
练习题:23. 二叉树的高度 (opens new window)
# c++
#include <iostream> #include <string> #include <unordered_map> using namespace std; // 计算二叉树的高度 int getHeight(TreeNode* root) { if (root == nullptr) { return 0; } int leftHeight = getHeight(root->left); int rightHeight = getHeight(root->right); return max(leftHeight, rightHeight) + 1; } int main() { int n; while (cin >> n) { string preorder, inorder; cin >> preorder >> inorder; unordered_map<char, int> indexMap; for (int i = 0; i < n; ++i) { indexMap[inorder[i]] = i; } TreeNode* root = buildTree(preorder, inorder, 0, 0, n - 1, indexMap); int height = getHeight(root); cout << height << endl; } return 0; }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# Java
// 方法一:递归 import java.util.Scanner; public class Main { static class TreeNode { char val; TreeNode left; TreeNode right; TreeNode(char val) { this.val = val; this.left = null; this.right = null; } } private static int getHeight(TreeNode root) { if (root == null) return 0; int leftHeight = getHeight(root.left); int rightHeight = getHeight(root.right); return Math.max(leftHeight, rightHeight) + 1; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { sc.nextInt(); String preOrder = sc.next(); String inOrder = sc.next(); TreeNode root = buildTree(preOrder, inOrder); int height = getHeight(root); System.out.println(height); } sc.close(); } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// 方法二:递归(使用哈希表来优化中序遍历中查找根节点位置的过程) import java.util.HashMap; import java.util.Scanner; public class Main { static class TreeNode { char val; TreeNode left; TreeNode right; TreeNode(char val) { this.val = val; this.left = null; this.right = null; } } public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { int N = sc.nextInt(); String preOrder = sc.next(); String inOrder = sc.next(); HashMap<Character, Integer> inOrderMap = new HashMap<>(); for (int i = 0; i < N; i++) { inOrderMap.put(inOrder.charAt(i), i); } TreeNode root = buildTree(preOrder, 0, N - 1, 0, N - 1, inOrderMap); int height = getHeight(root); System.out.println(height); } sc.close(); } private static int getHeight(TreeNode root) { if (root == null) { return 0; } int leftHeight = getHeight(root.left); int rightHeight = getHeight(root.right); return Math.max(leftHeight, rightHeight) + 1; } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# Python
class TreeNode: def __init__(self, val): self.val = val self.left = None self.right = None def get_height(root): if not root: return 0 left_height = get_height(root.left) right_height = get_height(root.right) return max(left_height, right_height) + 1 def main(): while True: try: N = int(input()) pre_order = input().strip() in_order = input().strip() in_order_map = {} for i in range(N): in_order_map[in_order[i]] = i root = build_tree(pre_order, 0, N - 1, 0, N - 1, in_order_map) height = get_height(root) print(height) except EOFError: break if __name__ == "__main__": main()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# Go
package main import "fmt" // 定义二叉树结构体 type treeNode struct { val byte // 节点的值 left *treeNode // 左子树 right *treeNode // 右子树 } // 计算二叉树的高度(深度) func height(root *treeNode) int { if root == nil { return 0 } leftHeight := height(root.left) rightHeight := height(root.right) if leftHeight > rightHeight { return leftHeight + 1 } else { return rightHeight + 1 } } func main() { var k int for { _, err := fmt.Scan(&k) if err != nil { break } preorder := make([]byte, k) inorder := make([]byte, k) fmt.Scan(&preorder, &inorder) // 构建二叉树 root := buildTree(preorder, inorder) // 计算二叉树高度 fmt.Println(height(root)) } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# JS
const rl=require("readline").createInterface({input:process.stdin}); const iter=rl[Symbol.asyncIterator](); const readline=async ()=>(await iter.next()).value; const out=process.stdout; class Node{ constructor(data){ this.data=data; this.left=null; this.right=null; } getHeight(){ let leftHeight=0,rightHeight=0; if(this.left!=null) leftHeight=this.left.getHeight(); if(this.right!=null) rightHeight=this.right.getHeight(); return Math.max(leftHeight,rightHeight)+1; } } async function main(){ while(line=await readline()){ // 获取输入的n n=parseInt(line); // 获取第一行字符串 let preOrder=await readline(); // 获取第二行字符串 let inOrder=await readline(); let root=Node.createTree(preOrder,inOrder,0,n-1,0,n-1); console.log(root.getHeight()); } } main();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 23. 多组测试数据。每组输入占一行,为两个字符串,由若干个空格分隔
练习题:24.最长公共子序列 (opens new window)
# C++
#include <iostream> #include <vector> #include <string> using namespace std; int main() { string text1, text2; while (cin >> text1 >> text2) { // 初始化dp数组 vector<vector<int>> dp(text1.size() + 1, vector<int>(text2.size() + 1, 0)); // 输出结果 cout << dp[text1.size()][text2.size()] << endl; } return 0; }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Java
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNextLine()) { String line = scanner.nextLine(); String[] s = line.split(" "); String x = s[0]; String y = s[1]; int m = x.length(); int n = y.length(); // 初始化dp数组 int[][] dp = new int[m + 1][n + 1]; // 输出 int max = dp[m][n]; System.out.println(max); } } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Go
package main import ( "fmt" ) func longestCommonSubsequence(X, Y string) int { m := len(X) n := len(Y) // 创建一个二维数组dp dp := make([][]int, m+1) for i := 0; i <= m; i++ { dp[i] = make([]int, n+1) } return dp[m][n] } func main() { var X, Y string for { // 输入两个字符串 _, err := fmt.Scan(&X, &Y) if err != nil { break } result := longestCommonSubsequence(X, Y) fmt.Println(result) } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# Python
while True: try: text1, text2 = input().split() except: break dp = [[0] * (len(text2) + 1) for _ in range(len(text1) + 1)] print(dp[len(text1)][len(text2)])
2
3
4
5
6
7
8
9
# Js
const readline = require('readline'); const rl = readline.createInterface({ input: process.stdin, output:process.stdout, }) rl.on('line',function(line){ const input = line.split(' '); const str1 = input[0], str2 = input[1]; const len1 = str1.length, len2 = str2.length; // 初始化dp数组 const dp = new Array(len1 + 1).fill(0).map(() => new Array(len2 + 1).fill(0)); // 输出 console.log(dp[len1][len2]); })
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 24. 多组测试数据,每组第一行为两个正整数n和m,接下来m行,每行3个整数, 最后一行两个整数
练习题:25. 最爱的城市 (opens new window)
# C++
int main() { int n, m; while (cin >> n >> m) { // 构建图 while (m--) { int a, b, l; std::cin >> a >> b >> l; } int x, y; std::cin >> x >> y; } return 0; }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main() { int n, m; while (cin >> n >> m) { // 构建图 for (int i = 0; i < m; i++) { int a, b, l; cin >> a >> b >> l; } int x, y; std::cin >> x >> y; } return 0; }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Java
import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { // 处理输入 int n = scanner.nextInt(); int m = scanner.nextInt(); for (int i = 0; i < m; i++) { int a = scanner.nextInt(); int b = scanner.nextInt(); int l = scanner.nextInt(); } int x = scanner.nextInt(); int y = scanner.nextInt(); // 处理输出 int res = dfs(graph, x, y, isVisit, sum); if (res != Integer.MAX_VALUE) { System.out.println(res); } else { System.out.println("No path"); } } } private static int dfs(int[][] graph, int start, int end, int[] isVisit, int sum) { if (end == start) { return sum; } return min; } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# Python
def main(): while True: try: # 接收一行作为输入,将之分隔成n, m n, m = map(int, input().split()) # 接收m行作为输入 for i in range(m): a, b, l = map(int, input().split()) # 接收一行作为输入,将之分隔成x, y x, y = map(int, input().split()) if dist[x][y] == float('inf'): print("No path") else: print(dist[x][y]) except EOFError: break if __name__ == "__main__": main()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Go
func main() { for { // 接收n和m var n, m int if _, err := fmt.Scan(&n, &m); err != nil { break } // 接收m行数据 for i := 0; i < m; i++ { var a, b, l int fmt.Scan(&a, &b, &l) } // 接收最后一行两个数据 var x, y int fmt.Scan(&x, &y) if graph[x][y] != math.MaxInt32 { fmt.Println(graph[x][y]) } else { fmt.Println("No path") } } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# JS
const readline = require('readline') const rl = readline.createInterface({ input: process.stdin, output: process.stdout }) let m, n let input = [] rl.on('line', (line) => { input.push(line) }).on('close', () => { let index = 0 while(index < input.length) { const [n,m] = input[index++].split(' ').map(Number) const edges = [] for(let i = 0; i < m; i++) { const [a,b,l] = input[index++].split(' ').map(Number) edges.push([a,b,l]) } const [x,y] = input[index++].split(' ').map(Number) const result = floydWarshall(n,m,edges,x,y) if(result === INF) { console.log('No path') } else { console.log(result) } } })
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28