【算法】根据输入的整数数组,以范围格式返回格式正确的字符串。
输入是一种整数有序数组的格式,使用逗号分隔
单个整数或由起始整数表示的整数范围,起始整数与结束整数之间用短划线“-”分隔。范围包括数值区间中的所有整数,包括两个端点。除非它至少跨越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 }