目录
LeetCode344:反转字符串
题目描述:
解题思路:
原题链接:344. 反转字符串 - 力扣(LeetCode)
LeetCode541:反转字符串II
题目描述:
解题思路:
原题链接;541. 反转字符串 II - 力扣(LeetCode)
LeetCode LCR122:路径加密
题目描述:
解题思路:
原题链接:LCR 122. 路径加密 - 力扣(LeetCode)
LeetCode 151 反转字符串的单词
题目描述:
解题思路:
原题链接:151. 反转字符串中的单词 - 力扣(LeetCode)
LeetCode LCR 182 动态口令
题目描述:
解题思路:
原题链接:LCR 182. 动态口令 - 力扣(LeetCode)
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 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--;
}
}
}
给定一个字符串 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--;
}
}
}
假定一段路径记作字符串 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);
}
}
给你一个字符串 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
某公司门禁密码使用动态口令技术。初始密码为字符串 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();
}
}