今天一个面试官老大哥,让我用springboot实现一个前后端交互的小例子,要求前端输入一个二维数组,提交后返回的数据 顺时针 打印出来,前后端交互问题是不大,主要是顺时针打印如图:
顺时针打印的意思如下图:
要求的结果如下图:
结果搞半天弄不出来,后来面试结束,我不死心,最后用笨方法来解决了;
这里请教各位有什么好的办法来解决吗?
(下面粘贴我的代码)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.js"></script>
<style type="text/css">
.line{
margin-left: 200px;
padding: 10px;
}
#desc{
width: 300px;
height: 150px;
}
</style>
</head>
<body>
<div class="line">
<label>账号:</label><input type="text" id="account"/>
</div>
<div class="line">
<label>密码:</label><input type="password" id="password"/>
</div>
<div class="line">
<label>描述:</label>
<textarea id="desc">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,51,52,53,54,55,56</textarea>
</div>
<div class="line">
<button id="submit" type="button">提交</button>
</div>
<div class="line" >
<p id="result"></p>
</div>
<script type="text/javascript">
$(function(){
$(document).on("click","#submit",login);
});
function login(){
var data = {
account:$("#account").val(),
password:$("#password").val(),
desc:$("#desc").val()
};
console.log(data);
$.ajax({
url:"/login",
type:"POST",
dataType:"JSON",
data:data,
success:function(res){
$("#result").html("结果:\n" + res.content);
},
error:function(){
console.log("网络异常!");
}
});
}
</script>
</body>
</html>
package com.example.demo2.controller;
import com.example.demo2.InfoDto;
import com.example.demo2.common.Result;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
@RestController
public class LoginController {
@PostMapping("login")
@ResponseBody
public Result<String> login(InfoDto dto){
Result<String> result = new Result<>();
StringBuilder sb = new StringBuilder();
sb.append("账号:").append(dto.getAccount()).append("<br/>");
sb.append("密码:").append(dto.getPassword()).append("<br/>");
//获取二维数组
String[][] arrays = getParams(dto.getDesc().trim());
//获取最小边
int min = getMin(arrays);
List<String> res = new ArrayList<>();
int x = 0, y = 0;
for(int i=0; i< min; i++){
//更新起点
x=y=i;
//System.out.println(printLine(i,i,arrays));
res.addAll(printLine(i,i,arrays));
//更新起点
x=1+i;
y=arrays[0].length - 1 - i;
//System.out.println(printCol(x ,y,arrays));
res.addAll(printCol(x ,y,arrays));
//更新起点
x=(arrays.length - 1) - i;
y=(arrays[0].length - 1) -1 - i;
//System.out.println(_printLine(x ,y,arrays));
res.addAll(_printLine(x,y,arrays));
//更新起点
x=(arrays.length - 1) - 1 - i;
y= i;
//System.out.println(_printCol(x ,y,arrays));
res.addAll(_printCol(x,y,arrays));
}
System.out.println(res.toString());
result.setCode(200);
result.setMsg("成功");
sb.append("顺时针转:").append("<br/>");
sb.append(res);
result.setContent(sb.toString());
return result;
}
// 横向从做到又
private List<String> printLine(Integer x, Integer y, String[][] arrays){
List<String> list = new ArrayList<>();
int current = x;
for(int i=x; i<arrays[0].length-current; i++){
list.add(arrays[x][i].trim());
}
return list;
}
// 竖向从上到下
private static List<String> printCol(Integer x, Integer y, String[][] arrays){
List<String> list = new ArrayList<>();
int current = x - 1;
for(int i=x; i<arrays.length - current; i++){
list.add(arrays[i][y].trim());
}
return list;
}
// 很向从右到左
private static List<String> _printLine(int x, int y, String[][] arrays){
List<String> list = new ArrayList<>();
int maxIndex = (arrays.length - 1);
int current = maxIndex - x;
for (int i = y; i >= 0 + current; i--) {
list.add(arrays[x][i].trim());
}
return list;
}
// 竖向从下到上
private static List<String> _printCol(int x, int y, String[][] arrays){
List<String> list = new ArrayList<>();
int current = y;
for (int i = x; i >= 0 + (current+1); i--) {
list.add(arrays[i][y].trim());
}
return list;
}
// 截取字符串, 获取二维数组
private String [][] getParams(String source){
String [][] resArray = {};
String[] firstArray = source.split(";");
for (int i=0; i<firstArray.length; i++) {
String[] secArray = firstArray[i].trim().split(",");
if(i==0){
resArray = new String[firstArray.length][secArray.length];
}
resArray[i]= secArray;
}
return resArray;
}
//获取最小边
private int getMin(String[][] arrays){
int len1 = arrays.length;
int len2 = arrays[0].length;
int min = Integer.min(len1,len2);
if(min % 2 == 0){
return min/2;
}else{
return min/2 + 1;
}
}
}
最后打印的效果如下: