力扣秋招算法题进大厂必备,小白入门,day1

一,反转字符串

给你一个字符串 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基础八股文,多多重复,百炼成钢。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值