求字符串中变换位置问题

问题:编写一函数求某一字符串如"ad2**cef***3e",将"*"置前,其它字符串位置不动,上面字符串返回"*****ad2cef3e",并返回"*"号个数5。


思路:

1、从数组中找到*号,放到新字符串里,同时将*号从原字符串中删除;

2、 然后将原字符串拼接到新字符串后面。


下面是代码:


	public static void changePosition() {
		/**
		 * 思路:1、从数组中找到*号,放到新字符串里,同时将*号从原字符串中删除;
		 * 2、 然后将原字符串拼接到新字符串后面
		 */
		String str = "ad2**cef***3e";
		int count = 0;//记录*号总数
		
		//遍历字符串,将其中的*号放入StringBuilder中
		StringBuilder builder = new StringBuilder();
		for (int i = 0; i < str.length(); i++) {
			String temp = str.substring(i, i + 1);
			if (temp.equals("*")) {
				builder.append(temp);
				count++;
			}
		}
		
		//将str字符串中的*号全部去掉
		str = str.replaceAll("\\*", "");
		
		//将去掉*号的字符串拼接到StringBuidler后面(StringBuilder中放的是*号)
		builder.append(str);
		System.out.println(builder.toString());
		System.out.println("*号的个数是:" + count);
	}




### 字符串变换的方法与技术 字符串变换是一种常见的编程任务,通常涉及对字符串中的字符重新排列、替换或其他形式的操作。以下是几种常用的字符串变换方法及其应用: #### 1. **交换字符串中任意两个不同位置字符** 此方法适用于需要通过有限次操作来优化字符串的情况。例如,在本题中,目标是找到一种方式使得经过一次交换后的字符串字典序尽可能小。 对于输入字符串 `bcdefa`,可以通过寻找第一个可以被更小字符替代的位置并执行交换完成操作[^2]。具体逻辑如下: - 遍历整个字符串,记录当前未处理部分中最小字符位置。 - 如果该最小字符不在首位,则将其与首字符交换以获得较小的前缀。 ```python def get_min_string(s): n = len(s) s_list = list(s) # 找到第一个可改进的位置 for i in range(n - 1): min_char = min(s_list[i + 1:]) if s_list[i] > min_char: # 寻找最靠右的相同最小字符索引 j = ''.join(s_list).rindex(min_char, i + 1) s_list[i], s_list[j] = s_list[j], s_list[i] break return ''.join(s_list) ``` #### 2. **基于贪心算法的选择最优方案** 贪心策略在此类问题中非常有效。它总是尝试局部最优解(即每次选择能带来最大收益的动作),从而期望达到全局最佳效果。上述代码片段正是利用了这一思想——优先考虑让前面的字母变得更小[^3]。 #### 3. **其他常见字符串变换技巧** 除了简单的字符互换外,还有许多高级的技术可用于解决复杂的字符串转换需: - **反转子序列**: 将指定范围内的元素顺序颠倒过来. - **删除重复项**: 去除连续或者非连续相同的项目. - **模式匹配和替换**: 使用正则表达式查找特定样式的数据然后替换成新的值. 下面展示如何实现基本的功能之一—反转一段文字的部分区域: ```cpp #include <iostream> #include <algorithm> void reverse_substring(std::string& str, int start, int end){ std::reverse(str.begin()+start,str.begin()+end+1); } int main(){ std::string test="hello world"; reverse_substring(test,6,10); // reverses 'world' to become 'dlrow' std::cout<<test<<"\n"; // prints hello dlrow } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值