代码随想录Day8:字符串Part1

目录

LeetCode344:反转字符串

题目描述:

解题思路:

原题链接:344. 反转字符串 - 力扣(LeetCode)

LeetCode541:反转字符串II

题目描述:

解题思路:

原题链接;541. 反转字符串 II - 力扣(LeetCode)

LeetCode LCR122:路径加密

题目描述:

解题思路:

原题链接:LCR 122. 路径加密 - 力扣(LeetCode)

LeetCode 151 反转字符串的单词

题目描述:

解题思路:

原题链接:151. 反转字符串中的单词 - 力扣(LeetCode)

LeetCode LCR 182 动态口令

题目描述:

解题思路:

原题链接:LCR 182. 动态口令 - 力扣(LeetCode)


LeetCode344:反转字符串

题目描述:

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

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

示例 1:

输入:s = ["h","e","l","l","o"]
输出:["o","l","l","e","h"]

解题思路:

使用双指针从头尾开始交换字符

public class Solution
{
    public void ReverseString(char[] s)
    {
        int left = 0;
        int right = s.Length-1;
        while (left < right)
        {
            char c = s[left];
            s[left] = s[right];
            s[right] = c;
            left++;
            right--;
        }
    }
}

原题链接:344. 反转字符串 - 力扣(LeetCode)

LeetCode541:反转字符串II

题目描述:

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

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

示例 1:

输入:s = "abcdefg", k = 2
输出:"bacdfeg"

解题思路:

每次让i 增加2K, 再进行判断 字符个数进行反转

using System.Text;

public class Solution
{
    public string ReverseStr(string s, int k)
    {
        char[] chars = s.ToCharArray();
        for (int i = 0; i < s.Length; i+=2*k) 
        {
            if (i+k<=s.Length)//剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
            {
                Reverse(chars, i, i + k-1);
            }
            else //反转全部剩余字符
            {
                Reverse(chars, i, s.Length - 1);
            }
        }
        return new string(chars);
    }



    public void Reverse(char[] array, int left, int right)
    {
        while (left < right) 
        {
            char temp = array[left];
            array[left] = array[right];
            array[right] = temp;
            left++;
            right--;
        }
    }
}

原题链接;541. 反转字符串 II - 力扣(LeetCode)

LeetCode LCR122:路径加密

题目描述:

假定一段路径记作字符串 path,其中以 "." 作为分隔符。现需将路径加密,加密方法为将 path 中的分隔符替换为空格 " ",请返回加密后的字符串。

示例 1:

输入:path = "a.aef.qerf.bb"

输出:"a aef qerf bb"

解题思路:

遍历字符,直接将‘.' 替换

public class Solution
{
    public string PathEncryption(string path)
    {
        char[] ans = path.ToCharArray();
        for (int i = 0; i < ans.Length; i++)
        {
            if (ans[i] == '.')
            {
                ans[i] =' ';
            }
        }
        return new string(ans);
    }
}

原题链接:LCR 122. 路径加密 - 力扣(LeetCode)

LeetCode 151 反转字符串的单词

题目描述:

给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

示例 1:

输入:s = "the sky is blue"
输出:"blue is sky the"

解题思路:

使用移除元素的逻辑 移除多余的空格,再进行字符串反转,然后再将每一个单词反转

using System.Text;

public class Solution
{
    public string ReverseWords(string s)
    {
        StringBuilder sb = RemoveSpace(s);
        reverseString(sb, 0, sb.Length-1);
        reverseEachWord(sb);
        return sb.ToString();
    }

    /// 
    /// 去除前后空格,和中间多余空格
    /// 
    /// 
    /// 
    public StringBuilder RemoveSpace(string s)
    {
        int start = 0;
        int end = s.Length - 1;
        while (s[start] == ' ')
            start++;
        while (s[end] == ' ')
            end--;
        StringBuilder sb = new StringBuilder();
        while (start <= end)
        {
            char c = s[start];
            if (c != ' ' || sb[sb.Length-1]!=' ')
            {
                sb.Append(c);
            }
            start++;
        }
        return sb;
    }

    /// 
    /// 反转区间[start,end]之间的字符
    /// 
    /// 
    /// 
    /// 
    public void reverseString(StringBuilder sb, int start, int end)
    {
        while (start < end) 
        {
            char temp = sb[start];
            sb[start] = sb[end];
            sb[end] = temp;
            start++;
            end--;
        }
    }


    public void reverseEachWord(StringBuilder sb)
    {
        int start = 0;
        int end = 1;
        int n = sb.Length;
        while (start

原题链接:151. 反转字符串中的单词 - 力扣(LeetCode)

LeetCode LCR 182 动态口令

题目描述:

某公司门禁密码使用动态口令技术。初始密码为字符串 password,密码更新均遵循以下步骤:

  • 设定一个正整数目标值 target
  • 将 password 前 target 个字符按原顺序移动至字符串末尾

请返回更新后的密码字符串。

示例 1:

输入: password = "s3cur1tyC0d3", target = 4
输出: "r1tyC0d3s3cu"

解题思路:

使用StringBulider 将前 target 个字符后面的字符先加入,再将 前 target 个字符加入

using System.Text;

public class Solution
{
    public string DynamicPassword(string password, int target)
    {
        StringBuilder sb = new StringBuilder();
        for (int i = target; i < password.Length; i++) 
        {
            sb.Append(password[i]);
        }
        for (int i = 0; i < target; i++)
        {
            sb.Append(password[i]);
        }
        return sb.ToString();
    }
}

原题链接:LCR 182. 动态口令 - 力扣(LeetCode)

你可能感兴趣的:(java,数据结构,javascript)