今日题目
本系列所选题目均来自力扣或者牛客网站. 所选题目主要是以其中的简单题为主, 中等题为辅, 包含少数困难题(原因是: 本人目前能力还不够~ ). 开展这个系列的目的是督促自己, 在暑假的时间里也要保持有一定的刷题量, 拒绝摆烂~
话不多说, 直接开刷~~
截断句子
题目描述: 句子 是一个单词列表,列表中的单词之间用单个空格隔开,且不存在前导或尾随空格。每个单词仅由大小写英文字母组成(不含标点符号)。
例如,“Hello World”、“HELLO” 和 “hello world hello world” 都是句子。
给你一个句子 s 和一个整数 k ,请你将 s 截断 ,使截断后的句子仅含 前 k 个单词。返回 截断 s 后得到的句子。
解题思路:
(1) 本题主要是要截取字符串中的一部分, 那么, 我们就可以先遍历这个字符串, 边遍历边将这些字符存到一个新的字符串里面, 直到遍历到满足条件的时候就停止, 记录下这个位置.
(2) 下面的代码定义新的字符串类型使用的是StringBuilder类型(这里最好不要使用String类, 代码运行效率会变慢很多, 具体原因可以看看这篇文章: “String、StringBuffer、StringBuilder三者的区别”), 然后就可以使用append方法来往字符串中添加字符. 最后再将StringBuilder类使用toString方法转成String类即可.
实现代码:
class Solution {
public String truncateSentence(String s, int k) {
StringBuilder sb=new StringBuilder();
for(int i=0;i<s.length();i++){
char ch=s.charAt(i);
if(ch==' '){
k--;
}
if(k==0){
break;
}
sb.append(ch);
}
String str=sb.toString();
return str;
}
}
删除有序数组中的重复项
题目描述: 给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。
将最终结果插入 nums 的前 k 个位置后返回 k 。
注: 不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
解题思路:
(1) 如若数组长度为零, 则返回0.
(2) 通过前后指针法, 前指针在前面进行查找, 看看当前值是否与上一个值是相等的, 如若是不相等的, 前后指针一起向后走; 如若是相等的, 则后指针不动, 前指针往后走, 直到不与前面一个的值相等的时候, 就将后指针的下一个值赋为这个值…
(3) 最后, num里面存的就是后指针走过的那些值, 后指针对应的数值就是修正后数组的长度.
实现代码:
class Solution {
public int removeDuplicates(int[] nums) {
int k=nums.length;
if(k==0){
return 0;
}
int fast=1;
int slow=1;
while(fast<k){
if(nums[fast-1]!=nums[fast]){
nums[slow]=nums[fast];
slow++;
}
fast++;
}
return slow;
}
}