反转字符串 II(给定一个字符串和一个整数 k,你需要对从字符串开头算起的每个 2k 个字符的前k个字符进行反转)

给定一个字符串和一个整数 k,你需要对从字符串开头算起的每个 2k 个字符的前k个字符进行反转。如果剩余少于 k 个字符,则将剩余的所有全部反转。如果有小于 2k 但大于或等于 k 个字符,则反转前 k 个字符,并将剩余的字符保持原样。

示例:

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

一些需要注意的我都在代码里注释了,直接看代码就能看

public class test0217 {
	public static void main(String[] args) {
		String s = "abcdefg";
		int k = 2;
		Solution S = new Solution();
		String s1 = S.reverseStr(s, k);
		System.out.println("变换后的字符串:"+s1);
	}
}


class Solution {
    public String reverseStr(String s, int k) {
        if(s==null || k<=0) 
            return null; 
        int len = s.length();
        int flag = 1; 
        char[] ch = s.toCharArray(); 
        for(int i=0;i<len;i=i+k)
        { 
            if(flag==1)  //用flag作为判断条件,每过2*k个字符旋转一次
            {
                swap(ch,i,len,k);
            }
        
            flag = 1-flag;  //让flag在1和0之间相互转换,
        }
        return new String(ch);
}


    public void swap(char[] ch,int i,int len,int k)
    {    
   
### 字符串整数k的算法或编程操作 字符串整数 `k` 的操作在算法设计中非常常见,通常涉及删除、反转、排序等操作。以下是一些常见的算法问题及其解决方案。 #### 1. 删除字符串中的 k 个字符以获得最小值 此问题的目标是从字符串中删除 `k` 个字符,使得剩下的字符串数值最小[^2]。可以使用贪心算法来解决这个问题。核心思想是通过栈结构维护当可能的最小序列,并确保删除较大的数字优先。 ```java import java.util.Scanner; public class RemoveStringNumber { public static void main(String[] args) { Scanner in = new Scanner(System.in); String num = in.next(); int k = in.nextInt(); StringBuilder res = new StringBuilder(); for (char c : num.toCharArray()) { while (k > 0 && res.length() > 0 && res.charAt(res.length() - 1) > c) { res.deleteCharAt(res.length() - 1); k--; } res.append(c); } // 如果仍有剩余的 k,则从末尾继续删除 while (k > 0) { res.deleteCharAt(res.length() - 1); k--; } // 去除导零 while (res.length() > 0 && res.charAt(0) == '0') { res.deleteCharAt(0); } String ans = res.length() == 0 ? "0" : res.toString(); System.out.println(ans); } } ``` #### 2. 每隔 2k 个字符反转 k 个字符 给定一个字符串 `s` 整数 `k`,需要对每隔 `2k` 个字符 `k` 个字符进行反转[^3]。可以使用双指针或迭代方法实现。 ```cpp class Solution { public: string reverseStr(string s, int k) { for (int i = 0; i < s.size(); i += 2 * k) { if (i + k <= s.size()) { reverse(s.begin() + i, s.begin() + i + k); } else { reverse(s.begin() + i, s.end()); } } return s; } }; ``` #### 3. 枚举字符串的所有排列并找到第 k 个排列 如果需要枚举字符串的所有排列并找到第 `k` 个排列,可以通过标准库函数 `next_permutation` 实现[^1]。 ```cpp #include <iostream> #include <algorithm> using namespace std; int main() { int t; cin >> t; for (int x = 1; x <= t; x++) { int n, k; cin >> n >> k; string s; for (int i = 1; i <= n - 2; i++) { s += 'a'; } s += "bb"; for (int i = 1; i <= k - 1; i++) { next_permutation(s.begin(), s.end()); } cout << s << endl; } return 0; } ``` #### 4. 转换字符串大小写 将字符串中的字符转换为大写或小写是一个简单的字符串操作[^5]。可以使用内置函数 `upper()` 或 `lower()` 完成。 ```python # 示例代码 s = "abC" print(s.upper()) # 输出: ABC print(s.lower()) # 输出: abc ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值