2023-09-20:用go语言,保证一定是n*n的正方形,实现从里到外转圈打印的功能

如果n是奇数,中心点唯一,比如

a b c

d e f

g h i

e是中心点,依次打印 : e f i h g d a b c

如果n是偶数,中心点为最里层2*2的右下点

比如

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 0 1 2 3

4 5 6 7 8 9

最里层是

o p

u v

v是中心点,依次打印 : v u o p q w ....

来自左程云

答案2023-09-20:

大体步骤如下:

1.定义一个函数print,接收一个二维字节切片m作为参数。

2.获取二维切片m的长度n。

3.设置四个变量a, b, c, d为(n-1)/2, (n-1)/2, n/2, n/2,分别表示每一层的起始点和终止点。

4.使用循环,从最外层到最内层逐层打印。

4.a.在每一层中,调用函数loop打印当前层的内容。

5.在循环结束后,打印换行符。

函数loop的过程如下:

1.判断如果a和c相等,表示只有一个元素,直接打印该元素并返回。

2.对于其他情况,依次打印当前层的四个边。

2.a. 从起始点的下一行开始,按列打印边界元素,即从上到下。

2.b. 从终止点的左侧列开始,按行打印边界元素,即从右到左。

2.c. 从终止点的上一行开始,按列打印边界元素,即从下到上。

2.d. 从起始点的右侧列开始,按行打印边界元素,即从左到右。

在主函数main中,定义了几个测试用例,分别为不同大小的二维字节切片m,然后调用print函数进行打印。

总的时间复杂度为O(n^2),其中n为输入二维切片m的大小。

总的额外空间复杂度为O(1),没有使用额外空间。

go完整代码如下:

package main

import "fmt"

func print(m [][]byte) {
n := len(m)
for a, b, c, d := (n-1)/2, (n-1)/2, n/2, n/2; a >= 0; a, b, c, d = a-1, b-1, c+1, d+1 {
loop(m, a, b, c, d)
}
fmt.Println()
} func loop(m [][]byte, a, b, c, d int) {
if a == c {
fmt.Printf("%c ", m[a][b])
} else {
for row := a + 1; row <= c; row++ {
fmt.Printf("%c ", m[row][d])
}
for col := d - 1; col >= b; col-- {
fmt.Printf("%c ", m[c][col])
}
for row := c - 1; row >= a; row-- {
fmt.Printf("%c ", m[row][b])
}
for col := b + 1; col <= d; col++ {
fmt.Printf("%c ", m[a][col])
}
}
} func main() {
map1 := [][]byte{{'a'}}
print(map1) map2 := [][]byte{{'a', 'b'}, {'c', 'd'}}
print(map2) map3 := [][]byte{{'a', 'b', 'c'}, {'d', 'e', 'f'}, {'g', 'h', 'i'}}
print(map3) map4 := [][]byte{{'a', 'b', 'c', 'd'}, {'e', 'f', 'g', 'h'}, {'i', 'j', 'k', 'l'}, {'m', 'n', 'o', 'p'}}
print(map4) map5 := [][]byte{{'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'}}
print(map5) map6 := [][]byte{{'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', '0', '1', '2', '3'}, {'4', '5', '6', '7', '8', '9'}}
print(map6)
}

rust完整代码如下:

fn print(m: &[Vec<char>]) {
let n = m.len() as i32;
let mut a = (n - 1) / 2;
let mut b = (n - 1) / 2;
let mut c = n / 2;
let mut d = n / 2;
while a >= 0 {
loop2(&m, a, b, c, d);
a -= 1;
b -= 1;
c += 1;
d += 1;
}
println!();
} fn loop2(m: &[Vec<char>], a: i32, b: i32, c: i32, d: i32) {
if a == c {
print!("{} ", m[a as usize][b as usize]);
} else {
for row in a + 1..=c {
print!("{} ", m[row as usize][d as usize]);
}
for col in (b..=d - 1).rev() {
print!("{} ", m[c as usize][col as usize]);
}
for row in (a..=c - 1).rev() {
print!("{} ", m[row as usize][b as usize]);
}
for col in b + 1..=d {
print!("{} ", m[a as usize][col as usize]);
}
}
} fn main() {
let map1: Vec<Vec<char>> = vec![vec!['a']];
print(&map1); let map2: Vec<Vec<char>> = vec![vec!['a', 'b'], vec!['c', 'd']];
print(&map2); let map3: Vec<Vec<char>> = vec![
vec!['a', 'b', 'c'],
vec!['d', 'e', 'f'],
vec!['g', 'h', 'i'],
];
print(&map3); let map4: Vec<Vec<char>> = vec![
vec!['a', 'b', 'c', 'd'],
vec!['e', 'f', 'g', 'h'],
vec!['i', 'j', 'k', 'l'],
vec!['m', 'n', 'o', 'p'],
];
print(&map4); let map5: Vec<Vec<char>> = vec![
vec!['a', 'b', 'c', 'd', 'e'],
vec!['f', 'g', 'h', 'i', 'j'],
vec!['k', 'l', 'm', 'n', 'o'],
vec!['p', 'q', 'r', 's', 't'],
vec!['u', 'v', 'w', 'x', 'y'],
];
print(&map5); let map6: Vec<Vec<char>> = vec![
vec!['a', 'b', 'c', 'd', 'e', 'f'],
vec!['g', 'h', 'i', 'j', 'k', 'l'],
vec!['m', 'n', 'o', 'p', 'q', 'r'],
vec!['s', 't', 'u', 'v', 'w', 'x'],
vec!['y', 'z', '0', '1', '2', '3'],
vec!['4', '5', '6', '7', '8', '9'],
];
print(&map6);
}

c++完整代码如下:

#include<iostream>
#include<vector> using namespace std; void loop(vector<vector<char>> m, int a, int b, int c, int d); void print(vector<vector<char>> m) {
int n = m.size();
for (int a = (n - 1) / 2, b = (n - 1) / 2, c = n / 2, d = n / 2; a >= 0; a--, b--, c++, d++) {
loop(m, a, b, c, d);
}
cout << endl;
} void loop(vector<vector<char>> m, int a, int b, int c, int d) {
if (a == c) {
cout << m[a][b] << " ";
}
else {
for (int row = a + 1; row <= c; row++) {
cout << m[row][d] << " ";
}
for (int col = d - 1; col >= b; col--) {
cout << m[c][col] << " ";
}
for (int row = c - 1; row >= a; row--) {
cout << m[row][b] << " ";
}
for (int col = b + 1; col <= d; col++) {
cout << m[a][col] << " ";
}
}
} int main() {
vector<vector<char>> map1 = { {'a'} };
print(map1); vector<vector<char>> map2 = { {'a', 'b'}, {'c', 'd'} };
print(map2); vector<vector<char>> map3 = { {'a', 'b', 'c'}, {'d', 'e', 'f'}, {'g', 'h', 'i'} };
print(map3); vector<vector<char>> map4 = { {'a', 'b', 'c', 'd'}, {'e', 'f', 'g', 'h'}, {'i', 'j', 'k', 'l'}, {'m', 'n', 'o', 'p'} };
print(map4); vector<vector<char>> map5 = { {'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'} };
print(map5); vector<vector<char>> map6 = { {'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', '0', '1', '2', '3'},
{'4', '5', '6', '7', '8', '9'} };
print(map6); return 0;
}

c完整代码如下:

#include <stdio.h>

void loop(char** m, int a, int b, int c, int d);

void print(char** m, int n) {
for (int a = (n - 1) / 2, b = (n - 1) / 2, c = n / 2, d = n / 2; a >= 0; a--, b--, c++, d++) {
loop(m, a, b, c, d);
}
printf("\n");
} void loop(char** m, int a, int b, int c, int d) {
if (a == c) {
printf("%c ", m[a][b]);
}
else {
for (int row = a + 1; row <= c; row++) {
printf("%c ", m[row][d]);
}
for (int col = d - 1; col >= b; col--) {
printf("%c ", m[c][col]);
}
for (int row = c - 1; row >= a; row--) {
printf("%c ", m[row][b]);
}
for (int col = b + 1; col <= d; col++) {
printf("%c ", m[a][col]);
}
}
} int main() {
char* map1[] = { "a" };
int n1 = sizeof(map1) / sizeof(char*);
print(map1, n1); char* map2[] = { "ab", "cd" };
int n2 = sizeof(map2) / sizeof(char*);
print(map2, n2); char* map3[] = { "abc", "def", "ghi" };
int n3 = sizeof(map3) / sizeof(char*);
print(map3, n3); char* map4[] = { "abcd", "efgh", "ijkl", "mnop" };
int n4 = sizeof(map4) / sizeof(char*);
print(map4, n4); char* map5[] = { "abcde", "fghij", "klmno", "pqrst", "uvwxy" };
int n5 = sizeof(map5) / sizeof(char*);
print(map5, n5); char* map6[] = { "abcdef", "ghijkl", "mnopqr", "stuvwx", "yz0123", "456789" };
int n6 = sizeof(map6) / sizeof(char*);
print(map6, n6); return 0;
}

2023-09-20:用go语言,保证一定是n*n的正方形,实现从里到外转圈打印的功能 如果n是奇数,中心点唯一,比如 a b c d e f g h i e是中心点,依次打印 : e f i h g的更多相关文章

  1. 2021.11.09 P2292 [HNOI2004]L语言(trie树+AC自动机)

    2021.11.09 P2292 [HNOI2004]L语言(trie树+AC自动机) https://www.luogu.com.cn/problem/P2292 题意: 标点符号的出现晚于文字的出 ...

  2. 1034 有理数四则运算 (20 分)C语言

    题目描述 本题要求编写程序,计算2个有理数的和.差.积.商. 输入描述: 输入在一行中按照"a1/b1 a2/b2"的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整 ...

  3. 【转】DBMS_STATS.GATHER_TABLE_STATS详解 2012-04-22 09:20:10

    [转]DBMS_STATS.GATHER_TABLE_STATS详解 2012-04-22 09:20:10 分类: Linux 由于Oracle的优化器是CBO,所以对象的统计数据对执行计划的生成至 ...

  4. Python Cookbook(第3版)中文版:15.20 处理C语言中的可迭代对象

    15.20 处理C语言中的可迭代对象¶ 问题¶ 你想写C扩展代码处理来自任何可迭代对象如列表.元组.文件或生成器中的元素. 解决方案¶ 下面是一个C扩展函数例子,演示了怎样处理可迭代对象中的元素: s ...

  5. idea报错:[2016-08-31 09:20:10,763] Artifact xxx:war exploded: Error during artifact deployment.

    [2016-08-31 09:20:10,763] Artifact newClassProject1:war exploded: Error during artifact deployment. ...

  6. C语言保证,0永远不是有效的数据地址,因此,返回址0可用来表示发生的异常事件

    C语言保证,0永远不是有效的数据地址,因此,返回址0可用来表示发生的异常事件

  7. js 对时间进行判断 现在的时间是否在后台给的开始时间 和 结束时间 内 (时间格式为:2018-09-03 09:20:30)

    function status(item){ let now = Date.parse(new Date()); let startString = Date.parse(new Date(Date. ...

  8. afx.h(78): fatal error C1083: 无法打开包括文件: “new.h”: No such file or directory

    vs2015新建mfc工程,编译错误: D:\program files (x86)\microsoft visual studio 14.0\vc\atlmfc\include\afx.h(78): ...

  9. \G 用法:查询结果按列打印

    \G 用法:查询结果按列打印 \G 放到sql语句后,可以使每个字段打印到单独的行, 如: mysql \G; mysql> select * from t \G;*************** ...

  10. D:\Software\Keil5\ARM\PACK\Keil\STM32F1xx_DFP\2.1.0\Device\Include\stm32f10x.h(483): error: #5: cannot open source input file "core_cm3.h": No such file or directory

    1. 错误提示信息: D:\Software\Keil5\ARM\PACK\Keil\STM32F1xx_DFP\2.1.0\Device\Include\stm32f10x.h(483): erro ...

随机推荐

  1. Python常用模块-20个常用模块总结

    目录 time模块 datetime模块 random 模块 os 模块 sys 模块 json 和 pickle 模块 hashlib和hmac 模块 logging 模块 numpy 模块 pan ...

  2. .Net7自定义GC垃圾回收器

    1.前言 CLR和GC高度耦合,.Net7里面分离CLR和GC,则比较容易实现这件事情.本篇来看下,自定义一个GC垃圾回收器. 2.概述 这里首先演示下自定义GC垃圾回收后的效果. 1.下载Custo ...

  3. 中华人民共和国企业所得税月(季)度预缴纳税申报表(A类,2018年版)

    企业按照<中华人民共和国公司法>有关规定整体改制,包括非公司制企业改制为有限责任公司或股份有限公司,有限责任公司变更为股份有限公司,股份有限公司变更为有限责任公司,原企业投资主体存续并在改 ...

  4. buffer busy waits等待事件案例-vage

    转自vage 讨厌香草冰激凌的汽车与Buffer busy wiats的故事        记得好几年前看到过一个故事,通用公司曾收到一客户的邮件,邮件中客户描述了一个非常奇怪的问题.他们家有晚饭后去 ...

  5. win10系统单独编译和使用WebRTC的回声消除(AEC)、音频增益(AGC)、去噪(NS)模块

    一.简介 本人想单独编译并使用WebRTC的音频回声消除模块,奈何技术有限,于是在百度的海洋里大海捞针,发现了https://www.cnblogs.com/mod109/p/5827918.html ...

  6. options has an unknown property ‘contentBase‘

    options has an unknown property 'contentBase' 踩坑新版webpack-dev-serve 新版的contentBase取消了替代属性是static

  7. go 流程控制之switch 语句介绍

    go 流程控制之switch 语句介绍 目录 go 流程控制之switch 语句介绍 一.switch语句介绍 1.1 认识 switch 语句 1.2 基本语法 二.Go语言switch语句中cas ...

  8. 理解maven命令package、install、deploy的联系与区别(转)

    https://blog.csdn.net/zhaojianting/article/details/80324533 我们在用maven构建java项目时,最常用的打包命令有mvn package. ...

  9. C#判断字符串的显示宽度

    C#判断字符串的显示宽度 起因: 公司有一个使用项目使用HTML转换为PDF,其中有一个表格,表格的最后一列中的单元格,其字符串超长后会被丢弃,而不是换行到下一行展示(HtmlToPdf渲染引擎导致的 ...

  10. PZthon

    一道新式题目,python.exe的分析 这个时候没有思路不要紧,直接wp 先用特别的软件执行.exe程序,就是对.exe进行反编译 然后在反编译脚本的目录写就有了一个打包文件夹 在里面找到文件的.p ...