获取方阵外圈元素并顺时针旋转90度API报错排查求助
问题排查与代码修正
一、路由匹配错误的原因及修复
浏览器报错No action was found on the controller 'XXX' that matches the request,核心原因是路由占位符名称与方法参数名不匹配:
你的路由定义是[Route("api/sunflower/{string}")],但方法参数是string input,ASP.NET无法将路由中的{string}绑定到input参数,导致找不到匹配的Action。
修复方案
将路由中的占位符名称改为与参数名一致:
[HttpGet] [Route("api/sunflower/{input}")] public string rotate(string input) { // 后续代码... }
如果输入字符串包含特殊字符(比如逗号),更稳妥的方式是改用查询参数:
[HttpGet] [Route("api/sunflower/rotate")] public string rotate([FromQuery] string input) { // 后续代码... } // 请求URL示例:api/sunflower/rotate?input=3,4,3,1,6,5,2,9,7,3
二、方阵外圈旋转逻辑的错误及修正
原代码的旋转逻辑完全不符合需求,以下是重新实现的正确逻辑:
核心思路
- 解析输入:第一个数字为方阵阶数
n,后续数字按行填充为n×n二维矩阵。 - 创建新矩阵,中间区域元素直接保留原矩阵的值。
- 处理外圈元素的顺时针旋转90度:
- 新矩阵的第一行 = 原矩阵的最后一列(从上到下)
- 新矩阵的最后一行 = 原矩阵的第一列(从上到下)
- 新矩阵的第一列(除首尾行) = 原矩阵第一行的中间元素(从右到左)
- 新矩阵的最后一列(除首尾行) = 原矩阵最后一行的中间元素(从左到右)
修正后的完整代码
[HttpGet] [Route("api/sunflower/{input}")] public string Rotate(string input) { try { // 解析输入为整数数组 int[] inputArr = input.Split(',').Select(s => int.Parse(s)).ToArray(); int n = inputArr[0]; // 验证输入合法性:总长度应为n² + 1(首元素是阶数) if (inputArr.Length != n * n + 1) { return "输入格式错误:元素总数应为n²+1(n为首元素)"; } // 构建原n×n矩阵 int[,] originalMatrix = new int[n, n]; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { originalMatrix[i, j] = inputArr[1 + i * n + j]; } } // 创建新矩阵,初始复制原矩阵 int[,] rotatedMatrix = new int[n, n]; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { rotatedMatrix[i, j] = originalMatrix[i, j]; } } // 处理外圈顺时针旋转90度 // 1. 新矩阵第一行 = 原矩阵最后一列(从上到下) for (int j = 0; j < n; j++) { rotatedMatrix[0, j] = originalMatrix[j, n - 1]; } // 2. 新矩阵最后一行 = 原矩阵第一列(从上到下) for (int j = 0; j < n; j++) { rotatedMatrix[n - 1, j] = originalMatrix[j, 0]; } // 3. 新矩阵第一列(除首尾行) = 原矩阵第一行的中间元素(从右到左) for (int i = 1; i < n - 1; i++) { rotatedMatrix[i, 0] = originalMatrix[0, n - 1 - i]; } // 4. 新矩阵最后一列(除首尾行) = 原矩阵最后一行的中间元素(从左到右) for (int i = 1; i < n - 1; i++) { rotatedMatrix[i, n - 1] = originalMatrix[n - 1, i]; } // 将新矩阵转换为输出字符串(按行用空格分隔,行之间用换行) List<string> outputLines = new List<string>(); for (int i = 0; i < n; i++) { List<string> lineElements = new List<string>(); for (int j = 0; j < n; j++) { lineElements.Add(rotatedMatrix[i, j].ToString()); } outputLines.Add(string.Join(" ", lineElements)); } return string.Join("\n", outputLines); } catch (Exception ex) { return $"处理出错:{ex.Message}"; } }
测试验证
输入字符串:3,4,3,1,6,5,2,9,7,3
输出结果:
1 2 3 3 5 7 4 6 9
完全符合示例需求。
内容的提问来源于stack exchange,提问作者Flora Jiang
相关产品推荐
相关产品推荐

