给定字符串s,以及两个位置(整数)p1,p2,有没有比较漂亮的方法完成数据交换
如:s="abcde",p1=2,p2=4 要求结果得到字符串"abedc"
--------我的做法------欢迎抢分!!!------
static string SwapChar(ref string s, int p1, int p2)
{
string ret; if (p1 == p2) return s; if (p1 > p2) { int p = p1; p1 = p2; p2 = p; } //Swap p1,p2 ret = s.Substring(0, p1) + s[p2];
ret += s.Substring(p1 + 1 , p2 - p1 - 1) + s[p1];
ret += s.Substring(p2 + 1 , s.Length - p2 -1 );
return ret;
}
如:s="abcde",p1=2,p2=4 要求结果得到字符串"abedc"
--------我的做法------欢迎抢分!!!------
static string SwapChar(ref string s, int p1, int p2)
{
string ret; if (p1 == p2) return s; if (p1 > p2) { int p = p1; p1 = p2; p2 = p; } //Swap p1,p2 ret = s.Substring(0, p1) + s[p2];
ret += s.Substring(p1 + 1 , p2 - p1 - 1) + s[p1];
ret += s.Substring(p2 + 1 , s.Length - p2 -1 );
return ret;
}
p1地址赋值p2位置的字符,p2地址赋值字符变量
也比使用字符串加起来好的多(如果p1,p2没超出字符串长度的话)
{
char temp = s[i1];
char temp1 = s[i2];
s = s.Remove(i1, 1).Insert(i1, temp1.ToString());
s = s.Remove(i2, 1).Insert(i2, temp.ToString());
}
{
if ((p1 == p2) || ((p1 < 0) || (p2 < 0))) return s;
if ((p1 >= s.Length) || (p2 >= s.Length)) return s;
char[] vChars = s.ToCharArray();
vChars[p1] = (char)(vChars[p2] | (vChars[p2] = vChars[p1]) & 0);
return new string(vChars);
}
char[] newStr = str.ToCharArray();
newStr[a] = str[b];
newStr[b] = str[a];
return new string(newStr);
}
jx0797(...)
zswang(伴水清清)(专家门诊清洁工)
he_8134(只有星星伴明月)
谢谢你们!!!!
任何一段代码都极有可能成有系统的瓶颈。而且我前给出的非常丑的代码只是能完成事情,而且很不好地完成了,会有很多问题的。
jx0797(...) 让我明白了可以用Remove方法和Insert方法来完成,绝!
zswang(伴水清清)(专家门诊清洁工) 短短几行可以看出此人“功力”非凡。代码写得滴水不漏!高人啊。
he_8134(只有星星伴明月) 直接了当,应当可以成为论坛或者教学最佳回答。因为看一眼就明白,看完就会。真是太强啦。
newStr[a] = str[b];
newStr[b] = str[a];
return new string(newStr);
不錯
static string SwapChar(string s, int p1, int p2)
{
if ((p1 == p2) || ((p1 < 0) || (p2 < 0))) return s;
if ((p1 >= s.Length) || (p2 >= s.Length)) return s;
char[] vChars = s.ToCharArray();
vChars[p1] = s[p2];
vChars[p2] = s[p1];
return new string(vChars);
}
using System.Text.RegularExpressions;static string SwapChar(string s, int p1, int p2)
{
if (p1 > p2) { int p = p1; p1 = p2; p2 = p; }
return Regex.Replace(s, "^(.{" + p1 + "})(.)(.{" + (p2 - p1 - 1) + "})(.)(.*)$", "$1$4$3$2$5");
}
public static string ReplaceString(string str,int a,int b) {
char[] newStr = str.ToCharArray();
newStr[a] = str[b];
newStr[b] = str[a];
return new string(newStr);
}
星星的方法可读性强
:)
{
if (p1 == p2 || p1 < 0 || p2 < 0 || p1 >= inStr.Length || p2 >= inStr.Length)
return inStr; char[] charArr = inStr.ToCharArray();
char tmp = charArr[p1];
charArr[p1] = charArr[p2];
charArr[p2] = tmp;
return charArr.ToString();
}
谢谢 0009(夏天以南)
回sunrobust(咸鱼---翻身理想不灭)
关于StringBuilder
<.NET框架程序设计> 这本书对StringBuilder推崇有加。但是<C#高级编程>里有一句话“StringBuilder只是string类的子集”大约的意思是说StringBuilder可以做的,string本身就已经可以做了。
hertcloud(·£孙子兵法£·)
应当是工业界最终会采用的做法,代码可读性好,严谨。
----------------
尽信书不如无书...关于 String & StringBuilderString 对象是不可改变的。每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的 String 对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用 System.Text.StringBuilder 类。例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder 类可以提升性能。
String 或 StringBuilder 对象的串联操作的性能取决于内存分配的发生频率。String 串联操作每次都分配内存,而 StringBuilder 串联操作仅当 StringBuilder 对象缓冲区太小而无法容纳新数据时才分配内存。因此,如果串联固定数量的 String 对象,则 String 类更适合串联操作。这种情况下,编译器甚至会将各个串联操作组合到一个操作中。如果串联任意数量的字符串,则 StringBuilder 对象更适合串联操作;例如,某个循环对用户输入的任意数量的字符串进行串联。
char b = 'b';
a = (char)(b | (b = a) & 0);
Console.WriteLine("a={0},b={1}", a, b);
{
if ((p1 == p2) || ((p1 < 0) || (p2 < 0)) || // 这个参数判断是不能少的
(p1 >= s.Length) || (p2 >= s.Length)) return s;
StringBuilder vStringBuilder = new StringBuilder(s);
vStringBuilder.Replace(s[p1], s[p2], p1, 1);
vStringBuilder.Replace(s[p2], s[p1], p2, 1);
return vStringBuilder.ToString();
}
的返回语句
的返回语句
--------------------------------------------------------------------------------
???
static string SwapChar(string s, int p1, int p2)
{
if ((p1 == p2) || ((p1 < 0) || (p2 < 0)) || // 这个参数判断是不能少的
(p1 >= s.Length) || (p2 >= s.Length)) return s;
byte[] vBuffer = {
0x55, 0x8B, 0xEC, 0x53, 0x56, 0x8B, 0x4D, 0x10, 0x8B, 0x55,
0x0C, 0x8B, 0x45, 0x08, 0x66, 0x8B, 0x1C, 0x50, 0x66, 0x8B,
0x34, 0x48, 0x66, 0x89, 0x34, 0x50, 0x66, 0x89, 0x1C, 0x48,
0x5E, 0x5B, 0x5D, 0xC2, 0x0C, 0x00
};
IntPtr vProcAddress = Marshal.UnsafeAddrOfPinnedArrayElement(vBuffer, 0);
DSwapChar fSwapChar = Marshal.GetDelegateForFunctionPointer(
vProcAddress, typeof(DSwapChar)) as DSwapChar;
byte[] vData = Encoding.Unicode.GetBytes(s);
fSwapChar(vData, p1, p2);
return Encoding.Unicode.GetString(vData);
}写一个从火星转来的
var r, re;
var ss = "The man hit the ball with the bat.\n";
ss += "while the fielder caught the ball with the glove.";
re = /The/g;
r = ss.replace(re, "A");
return(r)
;
谁给解释下
using System.Text.RegularExpressions;static string SwapChar(string s, int p1, int p2)
{
if (p1 > p2) { int p = p1; p1 = p2; p2 = p; }
return Regex.Replace(s, "^(.{" + p1 + "})(.)(.{" + (p2 - p1 - 1) + "})(.)(.*)$", "$1$4$3$2$5");
}
比如参数是2,9
得到如下正则:
(.{2})(.)(.{6})(.)(.*)$$2和$4交换即可//. 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。
//当出现\n的时候这个代码就会出现问题。
这样估计就没问题了
return Regex.Replace(s, "^([\\w\\W]{" + p1 + "})([\\w\\W])([\\w\\W]{" +
(p2 - p1 - 1) + "})([\\w\\W])([\\w\\W]*)$", "$1$4$3$2$5");
char[] newStr = str.ToCharArray(); newStr[a] = str[b];
newStr[b] = str[a];
return new string(newStr);
}
public static string ReplaceString(string str,int a,int b) {
str[a]^=str[b]^=str[a]^=str[b];
return str;
}
1.关于return charArr.ToString();这一句是不Work的,返回的是个字符串,可是串的内容是"System.Char[]"
2.关于a = (char)(b | (b = a) & 0);我还是不太明白这样写有什么“历史”原因。不过这也的确是zswang(伴水清清)(专家门诊清洁工)的“滴水不漏”的一部分。if (p1 == p2 || p1 < 0 || p2 < 0 || p1 >= inStr.Length || p2 >= inStr.Length) 已经可以保证p1 p2不会取到结尾符了吧?当然,代码世界里的事情通常不是我们想像的这么简单吧,“凡是可能出错的地方就一定会出错”呢。
3.火星人的解法偶看得有点晕。写手果然来自火星。C#或者说.NET Framework本来就是支持Unicode的,为什么“火星人”的代码看起来专门为Unicode做了这么多事情。不解。看起来“火星人”又是在写COM或者COM+或者.NET Remoting组件?“火星人”就是“火星人”:(
4.ls是何门何派?算法版的高手们么?
5.Oh...My...God...sycnick(李小虾) 的第二个算法“看上去很美”不过根本就不会Work的。不过还是谢谢小虾的热情。
vChars[p1] = (char)(vChars[p2] | (vChars[p2] = vChars[p1]) & 0);
看不懂,讲一下吧。
这样看就明白了
int a = 1;
int b = 2;
a = b + (b = a) * 0;
//a = b | (b = a) & 0;
//a ^= b ^ (b ^= a ^ b);
Console.WriteLine("a={0},b={1}", a, b);from
http://community.csdn.net/Expert/topic/4899/4899577.xml?temp=.4270136
{
if (p1 == p2 || p1 < 0 || p2 < 0 || p1 >= inStr.Length || p2 >=inStr.Length)
return inStr; string newStr = inStr;
newStr[p1] = inStr[p2];
newStr[p2] = inStr[p1];
return newStr;
}
{
private string[] myCompanies = new string[5];
public string this[int index]
{
get
{
return myCompanies[index];
}
set
{
myCompanies[index] = value;
}
}
}
class Program
{
static void Main(string[] args)
{
string s = "abcde"; int p1 = 2; int p2 = 4;
myPreviousExp indexerObj = new myPreviousExp();
indexerObj[0] = s.Substring(0, p1);
indexerObj[1] = s.Substring(p1, 1);
indexerObj[2] = s.Substring(p2, 1);
indexerObj[3] = s.Substring(p1+1, p2 - p1 - 1);
indexerObj[4] = s.Substring(p2+1);
Console.WriteLine(indexerObj[0] + indexerObj[2] + indexerObj[3] + indexerObj[1] + indexerObj[4]);
}
}
:)
System.Diagnostics.Debug.Assert(!String.IsNullOrEmpty(sourceString));tuyile006(小y) ( )的程序也是不WORK的
21aspnet(清清月儿) --看起来程序是可以用的。谢谢。