【算法】根据输入的整数数组,以范围格式返回格式正确的字符串。

输入是一种整数有序数组的格式,使用逗号分隔

单个整数或由起始整数表示的整数范围,起始整数与结束整数之间用短划线“-”分隔。范围包括数值区间中的所有整数,包括两个端点。除非它至少跨越3个数字,否则它不被视为一个范围。例如“12,13,15-17”表示数值范围。

完成解决方案,使输入数组按递增顺序获取整数列表,并以范围格式返回格式正确的字符串。

示例:

调用:solution([-10, -9, -8, -6, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20]);
返回: "-10--8,-6,-3-1,3-5,7-11,14,15,17-20"


算法实现:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Text;
 4 
 5 public class RangeExtraction
 6 {
 7    public static string Extract(int[] nums)
 8     {
 9         StringBuilder result = new StringBuilder();
10         int start = nums[0];
11         int end = nums[0];
12         bool rangeInProgress = false;
13 
14         for (int i = 1; i < nums.Length; i++) // 遍历数组,从第二个元素开始
15     {
16         if (nums[i] == end + 1) // 如果当前元素与结束值相差1,说明可以构建范围
17         {
18             end = nums[i]; // 更新结束值为当前元素
19             rangeInProgress = true; // 标记正在构建范围
20         }
21         else // 如果当前元素与结束值不相差1,说明无法构建范围
22         {
23             if (rangeInProgress && (end - start >= 2)) // 如果之前正在构建范围,并且范围至少包含3个数
24                 result.Append(start + "-" + end + ","); // 将范围以"起始值-结束值"的形式添加到结果中
25             else if (rangeInProgress) // 如果之前正在构建范围,但范围不包含至少3个数
26                 result.Append(start + "," + end + ","); // 将起始值和结束值分别添加到结果中
27             else // 如果之前没有构建范围
28                 result.Append(start + ","); // 将起始值添加到结果中
29 
30             start = nums[i]; // 更新起始值为当前元素
31             end = nums[i]; // 更新结束值为当前元素
32             rangeInProgress = false; // 标记停止构建范围
33         }
34     }
35 
36     if (rangeInProgress && (end - start >= 2)) // 如果最后一个范围正在构建,并且范围至少包含3个数
37         result.Append(start + "-" + end); // 将最后一个范围以"起始值-结束值"的形式添加到结果中
38     else if (rangeInProgress) // 如果最后一个范围正在构建,但范围不包含至少3个数
39         result.Append(start + "," + end); // 将最后一个范围的起始值和结束值分别添加到结果中
40     else // 如果最后一个范围没有构建
41         result.Append(start); // 将最后一个范围的起始值添加到结果中
42 
43     return result.ToString(); // 将结果转换为字符串并返回
44     }
45 }

测试用例:

 1 using NUnit.Framework;
 2 
 3 [TestFixture]
 4 public class RangeExtractionTests
 5 {
 6     [Test] public void Test1() 
 7    { 
 8     int[] nums = { 1, 2, 3, 5, 6, 7, 9 }; 
 9     string expected = "1-3,5-7,9"; 
10     string result = RangeExtraction.Extract(nums);
11     Assert.AreEqual(expected, result); 
12    }
13 
14     [Test]
15     public void Test2()
16     {
17         int[] nums = { 1, 3, 4 };
18         string expected = "1,3,4";
19         string result = RangeExtraction.Extract(nums);
20         Assert.AreEqual(expected, result);
21     }
22 
23     [Test]
24     public void Test3()
25     {
26         int[] nums = { 1, 2, 3, 4, 5 };
27         string expected = "1-5";
28         string result = RangeExtraction.Extract(nums);
29         Assert.AreEqual(expected, result);
30     }
31 
32     [Test]
33     public void Test4()
34     {
35         int[] nums = { 1, 2, 4, 5, 6 };
36         string expected = "1,2,4-6";
37         string result = RangeExtraction.Extract(nums);
38         Assert.AreEqual(expected, result);
39     }
40 
41     [Test]
42     public void Test5()
43     {
44         int[] nums = { -3, -2, 0, 1, 2, 3, 101, 102, 103 };
45         string expected = "-3,-2,0-3,101-103";
46         string result = RangeExtraction.Extract(nums);
47         Assert.AreEqual(expected, result);
48     }
49 }

 

posted @ 2023-07-12 10:45  lanedm  阅读(16)  评论(0编辑  收藏  举报