有一个字符串,里面有字母,数字和标点,例如"1w4rt,5t7?9u"。要求把里面的字母按原来的顺序倒着排列,别的数字和标点不变,结果应该是"1u4tt,5r7?9w"。这是我面试时,面试人员问的一道问题,大家帮解决下
解决方案 »
- 怎样让网站只显示首页地址?
- 【CMS,表的设计】【系统设计经验】我想设计一个能进行文章内容分页的的表,如何设计?
- checkbox 实现全选和独立选择的问题
- 非哥的思维飘逸的没话说 <div style="display:none" > 加分
- 怎么给xml文档中添加数据
- *******来放分了,!呵呵
- 头痛,为什么我的treeview在win2k pro和win98上展开后点击没反应,在winxp上没问题?
- 奇怪的问题:用.net的上传文件的组件写的上传文件功能,但却不能上传Office文件
- vb.net MVC Razor 引入命名空间
- 网站问题
- ajax调用ashx时获取session是不能取不到最新值是怎么回事啊!?
- asp连数据库,Microsoft OLE DB Provider for SQL Server 错误 '80004005',[DBNETLIB][ConnectionOpen (Connect()).]SQL Server 不存在或拒绝访问
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);
}
}
{
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);
}
#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;
}
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;
}
#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);
}
#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;
}
{
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);
}
说下我的思路吧!
提取里面的每个字符保存起来,然后转换成int型 要加try、catch 用if判断不报错就保存 然后置换 ok
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;
}
}
向大家推荐一款功能强大的CF辅助程序,2008-10-3更新。具体功能请点击网址查看!
#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");
}
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();
}
}
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();
}
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;
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;
这个效率差了一倍。要来回2次逐个判断isletter。头尾双管齐下,只要1次就够了。
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);
}
}
}
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));
}
}
#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);
}
{
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;
}
}
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)); }}
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>
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
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 . . .