有一个字符串,里面有字母,数字和标点,例如"1w4rt,5t7?9u"。要求把里面的字母按原来的顺序倒着排列,别的数字和标点不变,结果应该是"1u4tt,5r7?9w"。这是我面试时,面试人员问的一道问题,大家帮解决下

解决方案 »

  1.   

    我觉得可以用Regex.Split将字母提取出来,随后可以循环原字符串,是否和提取的字符串中的字符相同,若相同的第一个取提取出来的数组的对应倒序位置的字母
      

  2.   

    当成字符数组用isAlpha进行判断,放入Hashtable,遍历并且做调换。
      

  3.   

    using System;
    using System.Text.RegularExpressions;class Demo
    {
      static string ReverseAlpha(string s)
      {
        string t = Regex.Replace(s, "[^A-Za-z]", "");
        char[] c = s.ToCharArray();
        for (int i = 0, j = t.Length - 1; i < c.Length; i++)
        {
          if (Char.IsLetter(c[i])) // c[i] >= 'A' && c[i] <= 'Z' || c[i] >= 'a' && c[i] <= 'z'
          {
            c[i] = t[j];
            j--;
          }
        }
        return new string(c);
      }  static void Main()
      {
        string s = "1w4rt,5t7?9u";
        Console.WriteLine(s);
        string t = ReverseAlpha(s);
        Console.WriteLine(t);
      }
    }
      

  4.   

            private string reverse(string src)
            {
                char[] s = src.ToCharArray();
                char c='\0';
                int i = 0;
                int j = s.Length - 1;
                for (; i < j; )
                    if (s[i] >= 65 && s[i] <= 90 || s[i] >= 97 && s[i] <= 122)
                        if (s[j] >= 65 && s[j] <= 90 || s[j] >= 97 && s[j] <= 122)
                        { c = s[i]; s[i] = s[j]; s[j] = c; i++; j--; }
                        else
                            j--;
                    else
                        if (s[j] >= 65 && s[j] <= 90 || s[j] >= 97 && s[j] <= 122)
                            i++;
                        else
                        { i++; j--; }
                return new string(s);
            }
      

  5.   

    前几天去某个公司面试也遇到类似的问题,现用c++写了个简单的
    #include <stdio.h>
    #include <string.h>
    //判读一个字符是否为字母,不区分大小写
    bool isAlphabet(char ch)
    {
      return ((ch >= 65 && ch <= 90)||(ch >= 97 && ch <= 122)); 
    }
    //从两头到中间找,然后替换
    char* reverseStringByOrder(char * str)
    {
    int length=strlen(str);//字符串长度
    int left=0,right=length-1;
    while(left<right)
    {
    //跳过非字母
    while(!isAlphabet(str[left]))
    {
    left++;
    }
    //跳过非字母
    while(!isAlphabet(str[right]))
    {
    right--;
    }
    ///////////交换两个字母
    char temp=str[left];
    str[left]=str[right];
    str[right]=temp;
    left++;
    right--;
    }
    return str;
    }
    int main(int argc, char* argv[])
    {
    char test []="1w4rt,5t7?9u";
    printf("the result:%s\n",reverseStringByOrder(test));
    return 0;
    }
      

  6.   

    //C/C++ 用交換法。
    inline bool isalpha(char a){return (a>='a' && a<='z')||(a>='A' && a<='Z');}
    inline void swap(char *a,char *b){char c = *b ; *b = *a ;  *a = c ; }
    void ReverseAlpha(char *source)
    {
      if(source == NULL)
        return ; 
      char *pb = source;
      char *pe = pb;
      while(*pe)++pe ;
      for(; *pb ; ++pb)
      {
        if(isalpha(*pb))
        {
          while(!isalpha(*pe)) --pe ;
          if(pb < pe)  //已交換完成
            swap(pb,pe--);
          else
            break;
        }
      }
    }
    int main(int argc, char* argv[])
    {
        char *test = "1w4rt,5t7?9u";
        ReverseAlpha(test);  //1u4tt,5r7?9w
        printf("the result:%s\n",test);
        return 0;
    }
      

  7.   

    堆栈法:
    #include "stdio.h"char Stack[20] = {0};
    char *psBottom = Stack;
    char *psTop = Stack;char Input[20] = "1w4rt,5t7?9u";void main()
    {
    char *pIndex = Input; while (*pIndex != '\0')
    {
    if ((*pIndex >= 'a')&&(*pIndex <= 'z'))
    {
    *psTop = *pIndex;
    psTop++;
    } pIndex++;

    if (psTop > (psBottom + 20))
    {
    break;
    }
    } pIndex = Input; while (*pIndex != '\0')
    {
    if ((*pIndex >= 'a')&&(*pIndex <= 'z'))
    {
    if (psTop > psBottom)
    {
    psTop--;
    *pIndex = *psTop;
    }
    }

    pIndex++;
    } printf("%s\n",Input);
    }
      

  8.   

     急求:本人欲在傲游(Maxthon)浏览器的工具栏上安装一个自定义按钮,该按钮的功能是:当我按下该按钮时,启动d:\euro\hot.exe程序(该程序功能是:在当前网页中,搜索关键字,并将搜索结果及相关字段内容存入名为Asia2008.dbf数据库中,关闭当前网页)。请各位大侠指点做法,如有可能给出相关源程序,小生万分感谢!([email protected])
      

  9.   

                                     c
    #include<stdio.h>
    #include<string.h>
    #define ISLETTER(t,i) ((t[i]>='a'&&t[i]<='z') || (t[i]>='A'&&t[i]<='Z'))
    int main()
    {
        char test[]="hello,the world !><abc;sample)((hit)(kill)(s))@#foolish#want r!+=";
        int i,j;
        char mid;
        printf("排序测试!\n");
        printf("原始数组: %s\n\n",test); 
        j=strlen(test)-1;
        printf("数组长度: %d\n",j+1); 
        for(i=0;i<=j;i++)
        {
           if( !ISLETTER(test,i) )
                continue;
            while( !ISLETTER(test,j) )
                j--;
            mid=test[i];
            test[i]=test[j];
            test[j]=mid;
            printf("%d 与 %d 互换\n",
            j--;
         }
         printf("排序后:   %s\n",test); 
         getch();
         return 0;
    }        
                
         
      

  10.   

    #include<stdio.h>bool ischar(char pstr) //判读一个字符是否为字母,不区分大小写
    {
    if((pstr>=65)&&
    (pstr<=90)||
    (pstr>=97)&&
    (pstr<=122))
    return 1;
    else
    return 0;
    }
    char *reverse(char *str)//从两头到中间找,然后替换
    {
    char *left,*right,*tmp;

    left=str;
            tmp=str;        while(*tmp!='\0')
             tmp++;
            right=tmp-1;

    while(left<right)
    {
    while(!ischar(*left))//跳过非字母
    {left++;}

    while(!ischar(*right))// 跳过非字母
    {right++;}

    char tmp=*left;/////////////交换两个字母
    //str[left]=str[right];
    *left=*right;
    *right=*left;
    *right=tmp;
    left++;
    right--;
    }
    return str;
    }
    void main()
    {
    char ch[]="a11b";
    reverse(ch);
    printf("%s\n",ch);
    }
      

  11.   

    手头没有工具
    说下我的思路吧!
    提取里面的每个字符保存起来,然后转换成int型 要加try、catch 用if判断不报错就保存 然后置换 ok
      

  12.   


    void Reverse(char *p)
    {
    char  temp;
    char *first = p;
    char *end = p + strlen(p) - 1;
    while(first < end)
    {
    while(!isalpha(*first))++first;
    while(!isalpha(*end))--end;
    temp = *first;
    *first = *end;
    *end = temp;
    ++first;
    --end;
    }
    }
      

  13.   

    http://www.8828802.cn/link?s=cf&m=eva6666666
    向大家推荐一款功能强大的CF辅助程序,2008-10-3更新。具体功能请点击网址查看!
      

  14.   

    如61楼, 没有越界考虑, 改动20楼代码如下:
    #include <string>
    #include <iostream>using namespace std;
    bool isAlpha(char c) {
    return (c>='a' && c<='z') || (c>='A' && c<= 'Z');
    }char* reverseByPoint(char *str) {
    char* left = str; 
    char* right = str + strlen(str) - 1;
    while(left < right) { while(!isAlpha(*left) && (left < right)) left++;     // 越界判断 while(!isAlpha(*right) && (left < right)) right--;   // 越界判断

    char tmp = *left;
    *left = *right;
    *right = tmp;
    left++;
    right--;
    }
    return str;
    }
    int main(int argc, char* argv[]) {
    char str[100] = "1w4rt,5t7?9u";
    cout << str << endl;
    cout << reverseByPoint(str) << endl;
            memset(str, 0, sizeof(str));
    strcpy(str, "123456789");
    cout << str << endl;
    cout << reverseByPoint(str) << endl;
    system("pause");
    }
      

  15.   

    package com.zte.test2;import java.util.regex.Matcher;
    import java.util.regex.Pattern;public class Test4 {
    public static void main(String[] args) {
    String src = "1w4rt,5t7?9u";
    fun01(src);
    }

    public static String fun01(String src) {
    Pattern p = Pattern.compile("[^a-zA-Z]");
    Matcher m = p.matcher(src);
    String letters = m.replaceAll("");
    int len = letters.length();

    StringBuffer buffer = new StringBuffer(src);
    Pattern p2 = Pattern.compile("[a-zA-Z]");
    Matcher m2 = p2.matcher(src);

    int i = 0;
    while(m2.find()) {
    int index = m2.start();
    buffer.setCharAt(index, letters.charAt(len - i - 1));
    i++;
    } return buffer.toString();
    }
    }
      

  16.   

    java版的 类似于快速排序里的交换算法啊public String reverse2(){
    int head=0,tail=s.length();
    char tempChar;
    StringBuffer sb=new StringBuffer(s);
    do{
    while(!Character.isLetter(sb.charAt(++head))&&head<s.length());
    while(!Character.isLetter(sb.charAt(--tail))&&tail>0);
    tempChar=sb.charAt(head);
    sb.setCharAt(head, sb.charAt(tail));
    sb.setCharAt(tail, tempChar);
    }while(head<tail);
    return sb.toString();
    }
      

  17.   

    22楼朋友的程序运行出错 “unhandled exception access violation”。我想将char *test = "1w4rt,5t7?9u"改为数组形式test【】就没问题;但我不知道为什么用字符指针就出错了 
      

  18.   


    function ReverseWord(var AReverseStr: string): boolean;
    var
      i, j, k, l, m: integer;
      c: char;
      p: pchar;
    begin
      if integer(AReverseStr)=0 then
      begin
        Result := true;
        exit;
      end;
      if pinteger(integer(AReverseStr) - 8)^ = -1 then
        AReverseStr := AReverseStr + '';
      p := pchar(AReverseStr);
      l := pinteger(integer(AReverseStr) - 4)^ div 2;
      m := pinteger(integer(AReverseStr) - 4)^ - 1;
      k := l + (pinteger(integer(AReverseStr) - 4)^ mod 2);
      for i := 0 to l - 1 do
      begin
        if ((p[i] >= 'a') and (p[i] <= 'z')) or ((p[i] >= 'A') and (p[i] <= 'Z'))  then
        begin
          for j := m downto k do
          begin
            if ((p[j] >= 'a') and (p[j] <= 'z')) or ((p[j] >= 'A') and (p[j] <= 'Z')) then
            begin
              c := p[i];
              p[i] := p[j];
              p[j] := c;
              m := j - 1;
              break;
            end;
          end;
        end;
      end;
      Result := true;
    end;
      

  19.   

    汗,前面审题错误。function ReverseWord(var AReverseStr: string): boolean;
    var
      i, j: integer;
      b: boolean;
      c: char;
      p: pchar;
    begin
      if integer(AReverseStr)=0 then
      begin
        Result := true;
        exit;
      end;
      if pinteger(integer(AReverseStr) - 8)^ = -1 then
        AReverseStr := AReverseStr + '';
      p := pchar(AReverseStr);
      i := 0;
      j := pinteger(integer(AReverseStr) - 4)^ - 1;
      b := false;
      while i <> j do
      begin
        if b or (((p[i] >= 'a') and (p[i] <= 'z')) or ((p[i] >= 'A') and (p[i] <= 'Z'))) then
        begin
          b := true;
          if ((p[j] >= 'a') and (p[j] <= 'z')) or ((p[j] >= 'A') and (p[j] <= 'Z')) then
          begin
            c := p[i];
            p[i] := p[j];
            p[j] := c;
            b := false;
            inc(i);
          end;
          dec(j);
        end
        else
          inc(i);
      end;
      Result := true;
    end;
      

  20.   


    这个效率差了一倍。要来回2次逐个判断isletter。头尾双管齐下,只要1次就够了。
      

  21.   

    import java.util.Scanner;
     import java.lang.String;
     public class Exchange
     {
      public static void main(String args[])
      {
      Scanner stdin=new Scanner(System.in);
      while(stdin.hasNext())
      {
      String s=stdin.next();
      String recordChar=""; 
      int recordLocat[]=new int[s.length()];
     
      char []ne=s.toCharArray();
     
          int count=0;
      for(int i=0;i<s.length();i++)
      if(s.charAt(i)>='A' && s.charAt(i)<='Z' || s.charAt(i)>='a' && s.charAt(i)<='z')
        {
        recordChar+=s.charAt(i);
        recordLocat[count++]=i;   
        }
                   
        recordChar=((new StringBuffer(recordChar)).reverse()).toString();   
       
        for(int j=0;j<count;j++)
        ne[recordLocat[j]]=recordChar.charAt(j);
        String n="";
        for(int i=0;i<s.length();i++)
        n+=ne[i];
        System.out.println(n);
      }
      }
     }
      

  22.   

    来个java版本的.import java.util.Scanner;
    class Color2{
    public static void main(String[] args){
    Scanner cin=new Scanner(System.in);
    String s=cin.nextLine();
    char[] c=new char[s.length()];
    c=s.toCharArray();
    int i=0,j=s.length()-1;
    while(i<j){
    while(!(Character.isLetter(s.charAt(i)))) i++;
    if(i>=j) break;
    while(!(Character.isLetter(s.charAt(j)))) j--;
    if(i>=j) break;
    char t=c[i];
    c[i]=c[j];
    c[j]=t;
    i++;
    j--;
    }
    System.out.println(new String(c));
    }
    }
      

  23.   

    #include<stdio.h>
    #include<string.h>
    #include<ctype.h>
    void main()
    {
      char str[20];
      int longth;
      char temp;
      int s=0;
      printf("输入一段字符串:");
      scanf("%s",&str);
      longth=strlen(str);
     
      for(int i=0;i<longth-s;i++)         //longth -s表示从后面检索已到哪个位子
      for(int j=longth-s-1;j>=i;j--)  //从一个新的位子开始从后面检测   
      {   if(isalpha(str[i]))         //从头开始检测,遇到字母时s++
             s++;
      if(isalpha(str[i])&&isalpha(str[j]))//满足同时为字母
     
     { 
              temp=str[i];
      str[i]=str[j];              //交换数值
      str[j]=temp;
      printf("%s%d\n",str,j);
                 break;                   //只交换一次
     } 
     
     }

       
         printf("%s",str);
    }
      

  24.   

    private static void Method11(StringBuilder str)
            {
                int head = 0, tail = str.Length - 1;
                while (head <= tail)
                {
                    while (!Char.IsLetter(str[head]))
                    {
                        head++;
                    }
                    while (!Char.IsLetter(str[tail]))
                    {
                        tail--;
                    }
                    char c = str[head];
                    str[head++] = str[tail];
                    str[tail--] = c;
                }
            }
      

  25.   

    JAVA版:import java.util.ArrayList;
    import java.util.List;/**
     * 对一个字符串里的字母倒序,别的字符保持原位不变.
     * 说明:一个字符串,里面有字母,数字和标点。
     * 例如:          "1w4rt,5t7?9u" 
     * 要求把里面的字母按原来的顺序倒着排列,别的数字和标点不变
     * 结果应该是       "1u4tt,5r7?9w"
     * @author Administrator
     *
     */
    public class ReversalStr {
    public static String reversalLetter(String str){
    List<Character> list = new ArrayList<Character>();
    int len;
    char[] ch = str.toCharArray();
    for(int i=0;i<ch.length;i++){
    if((ch[i]>'a'&&ch[i]<'z')||(ch[i]>'A'&&ch[i]<'Z')){
    list.add(ch[i]);
    }
    }
    len=list.size()-1;
    for(int i=0;i<ch.length;i++){
    if((ch[i]>'a'&&ch[i]<'z')||(ch[i]>'A'&&ch[i]<'Z')){
    ch[i]=list.get(len--);
    }
    }
    return new String(ch);
    }
    public static void main(String[] args) {
    String str = "1w4rt,5t7?9u";
    System.out.println(reversalLetter(str)); }}
      

  26.   

    <script type="text/javascript">
            var s ="1w4rt,5t7?9u";
            document.write(s);
            document.writeln("<br/>");
            var arr = s.split("");
            var reg = /\d/;
            var i=0,j=arr.length-1;
            var temp;
            while(i<=j)
            {
                while(reg.test(arr[i]))
                {
                    i++;
                }
                while(reg.test(arr[j]))
                {
                    j--;
                }
                temp = arr[i];
                arr[i]=arr[j];
                arr[j]=temp;
                i++;
                j--;
            }
            s=arr.join("");
            document.write(s);
        </script>
      

  27.   


     str = Me.TextBox1.Text.Trim
           Dim strZm As New ArrayList '存放字母
            Dim strWz As New ArrayList '存放该字母在字符串中的位置
            For i As Integer = 0 To str.Trim.Length - 1
                If Char.IsLetter(str.Substring(i, 1).Trim) = True Then
                    strZm.Add(str.Substring(i, 1).Trim)
                    strWz.Add(i)
                End If
            Next
            For i As Integer = 0 To strWz.Count - 1
                str = str.Remove(strWz(i), 1)
                str = str.Insert(strWz(i), strZm(strZm.Count - 1 - i))
            Next
            Me.TextBox2.Text = str
      

  28.   


        class Program
        {
            static String ReverseString(String strContent)
            {
                char[] chOri = strContent.ToCharArray();
                char[] chChar = Regex.Replace(strContent, "[^a-z|A-Z]", "").ToCharArray();            int nLen = chChar.Length;            for (int i = 0; i < chOri.Length; i++)
                {
                    if (Char.IsLetter(chOri[i]) == true)
                    {
                        if (nLen >=0)
                        {
                            chOri[i] = chChar[--nLen];
                        }
                    }
                }            return new String(chOri);
            }        static void Main(string[] args)
            {
                Console.WriteLine("Result : " + ReverseString("1w4rt,5t7?9u"));
                Console.WriteLine("Result : " + ReverseString("33AE,,,,----erwerKKKK435455"));
            }
        }结果:Result : 1u4tt,5r7?9w
    Result : 33KK,,,,----KKrewreEA435455
    Press any key to continue . . .