反转字符串、反转字符串中的元音字母、两个数组的交集,springboot工作原理面试
作者:互联网
小编菜解
public static String reverseVowels(String s) {
List list = new ArrayList() {{
add(‘a’);
add(‘e’);
add(‘i’);
add(‘o’);
add(‘u’);
}};
char[] chars = s.toCharArray();
int lg = s.length();
int right = s.length();
//遍历字符串前半段,如果是元音,则寻找右半段的最后一个元音,然后交换。
//如果不是则不做处理。
for (int left = 0; left < lg / 2; left++) {
char e = 0;
if (list.contains(chars[left])) {
//寻找右半段的最后一个元音
for (int j = right - 1; j >= 0; j–) {
e = chars[j];
if (list.contains(e)) {
right = j;
break;
}
}
//交换最左元音和最右元音
char temp = chars[left];
chars[left] = e;
chars[right] = temp;
}
}
return new String(chars);
}
感觉list这块有点麻烦。
小编菜解改进版
public static String reverseVowels(String s) {
String const_A_U = “aeiouAEIOU”;
char[] chars = s.toCharArray();
int lg = s.length();
int right = s.length();
//遍历字符串前半段,如果是元音,则寻找右半段的最后一个元音,然后交换。
//如果不是则不做处理。
for (int left = 0; left < lg / 2; left++) {
char e = 0;
if (const_A_U.indexOf(chars[left])>=0) {
//寻找右半段的最后一个元音
for (int j = right - 1; j >= 0; j–) {
e = chars[j];
if (const_A_U.indexOf(e)>=0) {
right = j;
break;
}
}
//交换最左元音和最右元音
char temp = chars[left];
chars[left] = e;
chars[right] = temp;
}
}
return new String(chars);
}
虽然有点麻烦,但好赖思路清晰,感觉可以提交了,但是提示错误。Why?
大佬指点江山
public static String reverseVowels(String s) {
String const_AE = “aeiouAEIOU”;
char[] chars = s.toCharArray();
int lg = s.length();
int left = 0;
int right = lg - 1;
//遍历字符串前半段,如果是元音,则寻找右半段的最后一个元音,然后交换。
//如果不是则不做处理。
while (left < right) {
//如果不是元音
while (left < lg && const_AE.indexOf(chars[left]) < 0) {
++left;
}
//如果不是元音
while (right > 0 && const_AE.indexOf(chars[right]) < 0) {
–right;
}
if (left < right) {
char temp = chars[left];
chars[left] = chars[right];
chars[right] = temp;
++left;
–right;
}
}
re
《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》
【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享
turn new String(chars);
}
大佬的思路和我的是一样的,但是利用双指针进行操作明显比我的前半段后半段,更加直观简洁。
3、LeetCode 349.两个数组的交集
题目
给定两个数组,编写一个函数来计算它们的交集。
小编菜解
public static int[] intersection(int[] nums1, int[] nums2) {
Set set = new HashSet<>();
for (int i = 0; i < nums1.length; i++) {
for (int j = 0; j < nums2.length; j++) {
if (nums1[i] == nums2[j]){
set.add(nums1[i]);
}
}
}
int[] arr = new int[set.size()];
int i = 0;
for (int s : set) {
arr[i] = s;
i++;
}
return arr;
}
虽然解决了问题,提交成功了,但是总感觉,菜的令人发指,不是很满意。
小编菜解的时间复杂度是O(mn),也就是传统意义上的暴力算法,不建议采用。
思想及算法
如果使用哈希集合存储元素,则可以在 O(1)O(1) 的时间内判断一个元素是否在集合中,从而降低时间复杂度。
首先使用两个集合分别存储两个数组中的元素,然后遍历较小的集合,判断其中的每个元素是否在另一个集合中,如果元素也在另一个集合中,则将该元素添加到返回值。该方法的时间复杂度可以降低到 O(m+n)O(m+n)。
大佬指点江山
public static int[] intersection(int[] nums1, int[] nums2) {
Set set1 = new HashSet<>();
Set set2 = new HashSet<>();
for (int i = 0; i < nums1.length; i++) {
set1.add(nums1[i]);
}
for (int i = 0; i < nums2.length; i++) {
set2.add(nums2[i]);
}
return getIntersection(set1, set2);
}
public static int[] getIntersection(Set set1, Set set2) {
if (set1.size()>set2.size()){
return getIntersection(set2,set1);
}
Set set = new HashSet<>();
for (Integer x : set1){
if (set2.contains(x)){
set.add(x);
}
}
int[] ret = new int[set.size()];
int i = 0;
for (Integer x : set){
ret[i++] = x;
}
return ret;
}
代码貌似更繁琐了,但重要的是这个思想,尽量避免多重for循环。
时间复杂度不一样,执行用时提升显著。
推荐阅读
【100天算法入门 - 每日三题 - Day12】Nim游戏、3的幂、4的幂
【100天算法入门 - 每日三题 - Day11】丢失的数字、移动零、单词规律
【100天算法入门 - 每日三题 - Day10】二叉树的所有路径、各位相加、丑数
【100天算法入门 - 每日三题 - Day9】汇总区间、2的幂、有效的字母异位词
标签:right,springboot,int,反转,chars,元音,String,字符串,left 来源: https://blog.csdn.net/m0_64867896/article/details/121843375