难度:中等
题目要求:
给你一个 无重叠的,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
示例1:
输入:intervals = [[1,3],[6,9]], newInterval = [2,5]
输出:[[1,5],[6,9]]
示例2:
输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
输出:[[1,2],[3,10],[12,16]]
示例3:
输入:intervals = [], newInterval = [5,7]
输出:[[5,7]]
示例4:
输入:intervals = [[1,5]], newInterval = [2,3]
输出:[[1,5]]
示例5:
输入:intervals = [[1,5]], newInterval = [2,7]
输出:[[1,7]]
题解
直接遍历数组 i n t e r v a l s intervals intervals 完成插入 n e w I n t e r v a l newInterval newInterval 的操作
遍历数组 i n t e r v a l interval interval 的过程中,使用列表存储插入操作后的结果区间,应确保遍历所有区间(包括已有的区间和新区间)的顺序是按照开始位置升序的顺序,依次将每个遍历到的区间添加到列表,用 c u r r curr curr 表示当前遍历到的区间,如果 n e w I n t e r v a l newInterval newInterval 尚未插入且 c u r r [ 0 ] ≥ n e w I n t e r v a l [ 0 ] curr[0] \geq newInterval[0] curr[0]≥newInterval[0],则将 c u r r curr curr 添加到列表之前,首先将 n e w I n t e r v a l newInterval newInterval 添加到列表
每次将区间添加到列表的同时,判断新添加的区间是否和列表中已有的区间存在重叠,如果存在重叠则执行合并操作。由于遍历区间的顺序是按照开始位置升序的顺序,且列表中已有的区间互不重叠,因此当列表不为空时,只需要将新添加的区间和列表中的最后一个区间比较即可。具体操作如下。
- 如果列表不为空且当前区间的开始位置小于等于列表中的最后一个区间的结束位置,则将当前区间与列表中的最后一个区间合并,将列表中的最后一个区间的结束位置更新为两个区间的结束位置中的最大值。
- 如果列表为空或当前区间的开始位置大于列表中的最后一个区间的结束位置,则将当前区间添加到列表中。
当遍历结束之后,如果 n e w I n t e r v a l newInterval newInterval 仍未插入,则将 n e w I n t e r v a l newInterval newInterval 添加到列表
最后将列表转换为数组并返回
想法代码
public class Solution
{
public static void Main(string[] args)
{
int[][] intervals =
{
new[] { 1, 2 },
new[] { 3, 5 },
new[] { 6, 7 },
new[] { 8, 10 },
new[] { 12, 16 }
};
int[] newInterval = { 4, 8 };
Solution solution = new Solution();
int[][] res = solution.Insert(intervals, newInterval);
foreach (var a in res)
{
foreach (var b in a)
{
Console.Write(b + " ");
}
Console.WriteLine();
}
}
public int[][] Insert(int[][] intervals, int[] newInterval)
{
IList intervalList = new List();
bool inserted = false;
int length = intervals.Length;
for (int i = 0; i < length; i++)
{
int[] curr = intervals[i];
if (!inserted && curr[0] >= newInterval[0])
{
InsertInterval(intervalList, newInterval);
inserted = true;
}
InsertInterval(intervalList, curr);
}
if (!inserted)
{
InsertInterval(intervalList, newInterval);
}
return intervalList.ToArray();
}
public void InsertInterval(IList intervalList, int[] interval)
{
bool merged = false;
if (intervalList.Count > 0)
{
int[] prev = intervalList[intervalList.Count - 1];
if (interval[0] <= prev[1])
{
prev[1] = Math.Max(prev[1], interval[1]);
merged = true;
}
}
if (!merged)
{
intervalList.Add(interval);
}
}
}
难度:简单
题目要求:
给你一个字符串 s
,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。
单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。
示例1
输入:s = “Hello World”
输出:5
示例2
输入:s = " fly me to the moon "
输出:4
示例3
输入:s = “luffy is still joyboy”
输出:6
题解
题目要求得到字符串中最后一个单词的长度,可以反向遍历字符串,寻找最后一个单词并计算其长度。
由于字符串中至少存在一个单词,因此字符串中一定有字母。首先找到字符串中的最后一个字母,该字母即为最后一个单词的最后一个字母。
从最后一个字母开始继续反向遍历字符串,直到遇到空格或者到达字符串的起始位置。遍历到的每个字母都是最后一个单词中的字母,因此遍历到的字母数量即为最后一个单词的长度。
想法代码
public class Solution
{
public static void Main(string[] args)
{
string s = " fly me to the moon ";
Solution solution = new Solution();
int res = solution.LengthOfLastWord(s);
Console.WriteLine(res);
}
public int LengthOfLastWord(string s)
{
int index = s.Length - 1;
while (s[index] == ' ')
{
index--;
}
int wordLength = 0;
while (index >= 0 && s[index] != ' ')
{
wordLength++;
index--;
}
return wordLength;
}
}