一,反转字符串
给你一个字符串 s
,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s
中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s
中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
示例 1:
输入:s = "the sky is blue" 输出:"blue is sky the"
示例 2:
输入:s = " hello world " 输出:"world hello" 解释:反转后的字符串中不能存在前导空格和尾随空格。
示例 3:
输入:s = "a good example" 输出:"example good a" 解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。
解法一 :
class Solution {
public String reverseWords(String s) {
s=s.trim();
List<String> wordList = Arrays.asList(s.split("\\s+"));
Collections.reverse(wordList);
return String.join(" ",wordList);
}
}
知识点总结:
1.trim()
trim()的作用是去掉字符串两端的多余的空格,注意,是两端的空格,且无论两端的空格有多少个都会去掉。
2.Arrays.asList()
该方法是将数组转化成List集合的方法。
注意:
(1)该方法适用于对象型数据的数组
(2)该方法不建议使用于基本数据类型的数组
3. split(“\\s+“)
split()根据给定的正则表达式的匹配来拆分此字符串。
正则表达式的含义:
\\s表示空格,回车,换行等空白符,
+号表示一个或多个的意思。
解法二:
lass Solution {
public String reverseWords(String s) {
int left=0,right=s.length()-1;
while(left<=right&&s.charAt(left)==' '){
++left;
}
while(left<=right&&s.charAt(right)==' '){
--right;
}
Deque<String> d = new ArrayDeque<String>();
StringBuilder word = new StringBuilder();
while(left<=right){
char c = s.charAt(left);
if((word.length()!=0)&&(c ==' ')){
d.offerFirst(word.toString());
word.setLength(0);
}else if(c!=' '){
word.append(c);
}
++left;
}
d.offerFirst(word.toString());
return String.join(" ",d);
}
}
知识点总结:
1.charAt()
java.lang.String.charAt() 方法返回指定索引处的char值。索引范围是从0到length() - 1。
2.StringBuffer
String:在字符串不经常变化的场景中可以使用String类,例如常量的声明、少量的变量运算。
StringBuffer:在频繁进行字符串运算(如拼接、替换、删除等),并且运行在多线程环境中,则可以考虑使用StringBuffer,例如XML解析、HTTP参数解析和封装。
StringBuilder:在频繁进行字符串运算(如拼接、替换、和删除等),并且运行在单线程的环境中,则可以考虑使用StringBuilder,如SQL语句的拼装、JSON封装等。
3.Vector
向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。
vector是表示可变大小数组的序列容器。
就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。
本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小
为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。
4.双端队列(Deque)
Deque:在队列的两端都能进出的队列,继承自Queue接口,Deque的实现类是LinkedList、ArrayDeque、LinkedBlockingDeque,其中LinkedList是最常用的。
双端队列(两端都可进出):Deque deque = new LinkedList()
二,除自身以外数组的乘机
给你一个整数数组 nums
,返回 数组 answer
,其中 answer[i]
等于 nums
中除 nums[i]
之外其余各元素的乘积 。
题目数据 保证 数组 nums
之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请不要使用除法,且在 O(n)
时间复杂度内完成此题。
示例 1:
输入: nums = [1,2,3,4] 输出: [24,12,8,6]
示例 2:
输入: nums = [-1,1,0,-3,3] 输出: [0,0,9,0,0]
class Solution {
public int[] productExceptSelf(int[] nums) {
int length = nums.length;
int[] answer = new int[length];
answer[0] = 1;
for(int i = 1;i<length;i++){
answer[i] = nums[i-1]*answer[i-1];
}
int R= 1;
for(int i =length-1;i>=0;i--){
answer[i] = answer[i]*R;
R*=nums[i];
}
return answer;
}
}
2023秋招进大厂,算法题准备,知识点的总结,更重要的是解题思路,还涉及到java基础八股文,多多重复,百炼成钢。