代码随想录算法训练营第七天

LeetCode/卡码网题目

  • 344. 反转字符串
  • 541. 反转字符串 II
  • 2873. 有序三元组中的最大值 I (LeetCode每日一题)
  • 54. 替换数字(第八期模拟笔试)
  • 总结
  • 往期打卡


344. 反转字符串

跳转: 344. 反转字符串

问题:

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须 原地修改输入数组 、使用 O(1) 的额外空间解决这一问题。

思路:

左右双指针交换值

复杂度:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

代码:

class Solution {
    public void reverseString(char[] s) {
            char tmp;
        for(int i=0,j=s.length-1;i<j;i++,j--){
            tmp = s[i];
            s[i] = s[j];
            s[j] = tmp;
        }
    }
}

541. 反转字符串 II

跳转: 541. 反转字符串 II

问题:

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。
  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

思路:

根据题目,每隔2k翻转(双指针)k个字符,并加一步末尾判断

复杂度:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

代码:

class Solution {
    public String reverseStr(String s, int k) {
        char[] ch = s.toCharArray();
        for(int i=0;i<ch.length;i+=2*k){
            int l = i;
            int r = Math.min(ch.length-1,l+k-1);
            while(l<r){
                char tmp = ch[l];
                ch[l] = ch[r];
                ch[r] = tmp;
                l++;
                r--;
            }
        }
        return new String(ch);
    }
}

2873. 有序三元组中的最大值 I (LeetCode每日一题)

跳转: 2873. 有序三元组中的最大值 I

问题:

给你一个下标从 0 开始的整数数组 nums

请你从所有满足 i < j < k 的下标三元组 (i, j, k) 中,找出并返回下标三元组的最大值。如果所有满足条件的三元组的值都是负数,则返回 0

下标三元组 (i, j, k) 的值等于 (nums[i] - nums[j]) * nums[k]

思路:

可以直接三层for循环暴解
也可以用贪心记录历史最大数值(用来和后面的值构造新的最大差值)和历史最大差值以及当前最大结果

复杂度:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

代码(贪心):

class Solution {
    public long maximumTripletValue(int[] nums) {
        int max = nums[0];
        int k = nums[0]-nums[1];
        long res = 0;
        for(int i=2;i<nums.length;i++){
            res = Math.max(res,(long)k*nums[i]);
            max = Math.max(max,nums[i-1]);
            k = Math.max(k,max-nums[i]);
        }
        return res;
    }
}

54. 替换数字(第八期模拟笔试)

跳转: 54. 替换数字(第八期模拟笔试)

问题:

给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 “a1b2c3”,函数应该将其转换为 “anumberbnumbercnumber”。

思路:

这题主要是练习字符串操作,不建议直接使用s = s.replaceAll("\\d", "number");
先计数,然后拓展数组(如果是C的话),再用双指针逐一复制直至两指针相等(后面不会再有数字);

复杂度:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

代码:

import java.util.Scanner;

class Main{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String s = sc.next();
		System.out.println(replaceNumber(s));
	}
	private static String replaceNumber(String s) {
		int count = 0;
		int oldSize = s.length();
		for(int i=0;i<oldSize;i++) {
			if(Character.isDigit(s.charAt(i))) count++;
		}
		char[] newCh = new char[oldSize+5*count];
		System.arraycopy(s.toCharArray(), 0, newCh, 0, oldSize);
		for(int i = oldSize-1,j=newCh.length-1;i<j;i--,j--) {
			if(!Character.isDigit(newCh[i])) {
				newCh[j] = newCh[i];
			}else {
				newCh[j] = 'r';
				newCh[--j] = 'e';
				newCh[--j] = 'b';
				newCh[--j] = 'm';
				newCh[--j] = 'u';
				newCh[--j] = 'n';
			}
		}
		return new String(newCh);
	}
}

总结

练习了字符串的基本操作以及双指针操作字符数组.

往期打卡

代码随想录算法训练营第一天
代码随想录算法训练营第二天
代码随想录算法训练营第三天
代码随想录算法训练营第四天
代码随想录算法训练营周末一
代码随想录算法训练营第五天
代码随想录算法训练营第六天

你可能感兴趣的:(算法)