java 字符串反转 取2个字符串所有交叉的字符串

本文介绍了三种不同的字符串反转方法,包括利用字符数组和StringBuffer类实现。此外还提供了一个用于获取两个字符串中相同字符序列的实用函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//字符串反转方法
public String revert(String str){
       char[] cr =  str.toCharArray();
       StringBuffer sb = new StringBuffer();
       for(int i=cr.length-1;i>=0;i--){
           sb.append(cr[i]);
       }
       return sb.toString();

如果没有限制不能使用java自带的方法 可以用stringbuffer 的reverse()方法

//字符串反转方法2
public String revert(String str){
      StringBuffer sb = new StringBuffer();
      sb.append(str);
      sb.reverse();
      return sb.toString();
}

方法3 一般这种方式的好可以避免用到类库

//字符串反转方法3
public String revert(String str){
     StringBuffer sb = new StringBuffer();
     for(int i=str.length()-1;i>=0;i--){
         sb.append(str.charAt(i));
     }
     return sb.toString();
}

 

//取得2个字符串所有相同的字符组
 public String[] getRepeat(String a,String b){
     int len = 0;
     String res="";
     Set<String> strset = new HashSet<String>();
     if(a.length()>=b.length()){
       len = b.length();
     }else{
       len = a.length();
     }
     for(int i=0;i<len;i++){
      if(a.charAt(i)==b.charAt(i)){
           res += a.charAt(i);
       }else{
         strset.add(res);
           res="";
       }
     }
       if(null!=res&&res!=""){
         strset.add(res);
      }
      return strset.toArray(new String[0]);
 }

<think>好的,我现在需要帮用户实现字符串头尾间隔输出的功能,比如输入abcdef,输出afbecd。用户提到类似引用1中的例子,所以首先我得理解这个问题的具体要求。 首先,用户的需求是将字符串的第一个字符和最后一个字符输出,然后是第二个和倒数第二个,依此类推。例如,输入abcdef,长度为6,那么输出顺序应该是索引0和5,然后是1和4,接着是2和3。最终结果是afbecd。对于奇数长度的字符串,比如abcde,中间的那个字符应该放在最后,比如aebdc。 接下来,我需要考虑如何用编程语言实现这个逻辑。用户可能对具体语言没有限制,但引用的例子中有Python、Java、C,所以可能需要通用方法。不过用户之前提到Python的快速排序示例,可能更倾向于Python解答。 首先,确定字符串的长度,然后使用双指针,一个从头部开始,另一个从尾部开始,依次字符。当两个指针相遇或交叉时停止。需要注意的是,当字符串长度为奇数时,中间的那个字符需要单独处理。 具体步骤: 1. 初始化两个指针,i=0,j=字符串长度-1。 2. 创建一个结果列表或字符串。 3. 循环,当i <= j时: a. 如果i等于j,说明是奇数长度的中间字符,直接添加到结果。 b. 否则,添加s[i]和s[j]到结果中。 c. i递增,j递减。 4. 返回结果字符串。 比如,对于abcdef: i=0, j=5 → a和f → af i=1, j=4 → b和e → be i=2, j=3 → c和d → cd 结果afbecd。 对于abcde: i=0,j=4 → a和e → ae i=1,j=3 → b和d → bd i=2,j=2 → c单独 → c 结果aebdc。 这样就能处理所有情况了。接下来需要考虑不同语言的实现差异。比如在Python中,字符串是不可变的,所以可能需要用列表来构建结果。在Java中,可能需要用StringBuilder,C语言则用字符数组。 现在,检查用户提供的引用,引用1中的例子是Python,但用户的问题可能希望用Python解答,因为之前的示例代码是Python的快速排序。不过用户可能希望得到多种语言的实现,但根据用户的问题描述,可能只需要一种。需要确认用户的需求,但根据问题描述,用户可能希望得到具体语言的实现,比如Python,但引用中也提到了Java和C的例子,所以可能需要提供多种语言的示例。 不过用户的问题结尾是“如何用编程语言实现”,没有指定具体语言,所以可能需要给出一个通用的方法,或者选择几种常见的语言来实现,比如Python、Java、C等。 但为了简洁,可能先给出Python的实现,再根据用户需求是否扩展。根据引用1中的示例,用户可能需要Python代码,所以先考虑Python。 Python实现: 输入字符串s,初始化i和j,循环处理。例如: def head_tail_interleave(s): result = [] i, j = 0, len(s) - 1 while i <= j: if i == j: result.append(s[i]) else: result.append(s[i]) result.append(s[j]) i += 1 j -= 1 return ''.join(result) 测试一下这个函数,输入abcdef,应该返回afbecd。输入abcde,返回aebdc。这符合预期。 另外,需要考虑空字符串的情况,比如输入长度为0时,应该返回空。代码中i=0,j=-1,循环条件不满足,直接返回空,这没问题。 Java实现的话,可以用类似的方法: public static String interleave(String s) { StringBuilder sb = new StringBuilder(); int i = 0, j = s.length() - 1; while (i <= j) { if (i == j) { sb.append(s.charAt(i)); } else { sb.append(s.charAt(i)); sb.append(s.charAt(j)); } i++; j--; } return sb.toString(); } C语言的话,需要处理字符数组,动态分配内存,但可能复杂一些。例如: #include <stdio.h> #include <string.h> #include <stdlib.h> char* interleave(const char* s) { int len = strlen(s); char* result = malloc(2 * len + 1); // 分配足够空间,包括结束符 int k = 0; int i = 0, j = len - 1; while (i <= j) { if (i == j) { result[k++] = s[i]; } else { result[k++] = s[i]; result[k++] = s[j]; } i++; j--; } result[k] = '\0'; return result; } 用户的问题可能希望得到Python的实现,因为示例中的快速排序是Python代码。所以重点放在Python的实现上,但可能也需要提到其他语言的可能性。 接下来需要验证代码的正确性。例如输入空字符串,返回空;输入长度为1的字符串,返回原字符串;输入abcdef,正确输出afbecd。这些情况都测试通过。 然后,用户提到的引用3和引用4涉及字符串反转和提部分字符,但当前问题不需要反转,而是交替头尾字符。所以可能不需要用到arraycopy或反转的方法,但需要双指针遍历。 可能的问题点:当字符串长度为偶数时,刚好处理完所有字符;当为奇数时,中间的字符被单独处理。这样逻辑是正确的。 现在,总结步骤: 1. 初始化双指针。 2. 循环头尾字符。 3. 处理奇数长度的情况。 4. 组合结果。 这样,用户就能根据这个逻辑在不同语言中实现功能了。</think>### 字符串头尾间隔输出实现方法 要实现字符串头尾间隔输出(例如输入`abcdef`输出`afbecd`),可以通过双指针法遍历字符串首尾字符。以下是具体实现步骤和代码示例: #### 实现逻辑 1. **初始化指针**:定义头指针`i=0`和尾指针`j=len(s)-1` 2. **交替拼接字符**: - 若`i <= j`,将`s[i]`和`s[j]`依次加入结果 - 若`i == j`(奇数长度字符串的最后一位),只添加一次字符 3. **移动指针**:每次循环后`i += 1`,`j -= 1` #### Python代码示例 ```python def head_tail_interleave(s): result = [] i, j = 0, len(s) - 1 while i <= j: if i == j: result.append(s[i]) # 奇数长度中间字符处理 else: result.append(s[i]) result.append(s[j]) i += 1 j -= 1 return ''.join(result) # 测试 print(head_tail_interleave("abcdef")) # 输出 afbecd print(head_tail_interleave("abcde")) # 输出 aebdc ``` #### Java代码示例 ```java public static String interleave(String s) { StringBuilder sb = new StringBuilder(); int i = 0, j = s.length() - 1; while (i <= j) { if (i == j) { sb.append(s.charAt(i)); } else { sb.append(s.charAt(i)); sb.append(s.charAt(j)); } i++; j--; } return sb.toString(); } ``` #### 关键点说明 - **时间复杂度**:$O(n)$,仅需一次线性遍历 - **空间复杂度**:$O(n)$,用于存储结果 - **边界处理**:空字符串和单字符可直接返回原值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值