【經典】華爲遠程機試題分享

今天一個面試官老大哥,讓我用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;
        }
    }
}

 

最後打印的效果如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章