java 中字符串的转置和取消转置
我一直在研究两种分别转置和取消转置字符串的方法。据我所知,我提出的解决方案都有效。我只是想知道是否可以用更简单的方式解决这些问题。我的代码对于正在执行的任务来说似乎太长了。第一个方法 transpose() 将采用 String 作为参数并对其进行转置。如果输入“bridge”,则输出将为“bergid”。同样,使用 unTranspose() 方法,如果用户输入“bergid”,则输出将为“bridge”。
public void transpose( String s )
{
String t = "";
int end = s.length() - 1;
for ( int i = 0; i < s.length() / 2; i++ )
{
t += Character.toString( s.charAt( i ) ) + Character.toString( s.charAt( end ) );
end--;
}
// Lenth of String is odd
if ( s.length() % 2 == 1 )
{
// add character in middle of String to the end of the new String
t+= Character.toString( s.charAt( s.length() / 2 ) );
}
System.out.println( t );
}
public void unTranspose( String s )
{
String t = "";
// Length of String is odd
if ( s.length() % 2 == 1 )
{
for ( int i = 0; i < s.length(); i+=2 )
{
t+= Character.toString( s.charAt( i ) );
}
for ( int i = s.length() - 2; i > 0; i -= 2 )
{
t += Character.toString( s.charAt( i ) );
}
System.out.println( t );
}
// Length of String is even
else if ( s.length() % 2 == 0 )
{
for ( int i = 0; i < s.length() - 1; i+=2 )
{
t+= Character.toString( s.charAt( i ) );
}
for ( int i = s.length() - 1; i > 0; i -= 2 )
{
t+= Character.toString( s.charAt( i ) );
}
System.out.println( t );
}
}
我的代码看起来很糟糕。我仍然不习惯正确格式化我的代码。请耐心听我说。
感谢您抽出时间
定义
transpose
--------->
"123Xcba" "1a2b3cX"
<-----------
untranspose
I have been working on two methods that will Transpose and Untranspose a String respectively. The solutions that I have come up with both work to the best of my knowledge. I just want to know if I could have solved these problems in a simpler way. My code seems like it is too long for the task that is being performed. The first method, transpose(), will take a String as a parameter and transpose it. If "bridge" is entered, the output will be "bergid". Likewise, with the unTranspose() method, if the user enters "bergid", the output will be "bridge".
public void transpose( String s )
{
String t = "";
int end = s.length() - 1;
for ( int i = 0; i < s.length() / 2; i++ )
{
t += Character.toString( s.charAt( i ) ) + Character.toString( s.charAt( end ) );
end--;
}
// Lenth of String is odd
if ( s.length() % 2 == 1 )
{
// add character in middle of String to the end of the new String
t+= Character.toString( s.charAt( s.length() / 2 ) );
}
System.out.println( t );
}
public void unTranspose( String s )
{
String t = "";
// Length of String is odd
if ( s.length() % 2 == 1 )
{
for ( int i = 0; i < s.length(); i+=2 )
{
t+= Character.toString( s.charAt( i ) );
}
for ( int i = s.length() - 2; i > 0; i -= 2 )
{
t += Character.toString( s.charAt( i ) );
}
System.out.println( t );
}
// Length of String is even
else if ( s.length() % 2 == 0 )
{
for ( int i = 0; i < s.length() - 1; i+=2 )
{
t+= Character.toString( s.charAt( i ) );
}
for ( int i = s.length() - 1; i > 0; i -= 2 )
{
t+= Character.toString( s.charAt( i ) );
}
System.out.println( t );
}
}
My code looks horrible. I'm still not used to formatting my code correctly. Please bear with me.
Thanks for your time
Definition
transpose
--------->
"123Xcba" "1a2b3cX"
<-----------
untranspose
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
使用递归
Using Recursion
该解具有良好的对称性。
这清楚地表明两种方法之间的逻辑是相同的;唯一的区别是:
untranspose
、i
和j
是写入索引,x
是读取索引(即相反)这真的很简单:
i
总是从字符串的开头到中间j
总是从字符串的末尾到中间x
总是从开头到end of stringi == j
i
,因此break
Lalith 提出了第一个递归解决方案;这个本质上是一样的,只做了一些小的修改:
This solution has a nice symmetry.
This makes it obvious that the logic between the two methods are identical; the only difference is that:
transpose
,i
andj
are read indices,x
is a write indexuntranspose
,i
andj
are write indices,x
is a read index (i.e. it's the other way around)It's really quite simple:
i
always goes from beginning to middle of stringj
always goes from end to middle of stringx
always goes from beginning to end of stringi == j
eventuallyi
, sobreak
Lalith came up with the first recursive solution; this one is essentially the same, with minor modification:
这是我对此的回应 - 我在代码中看到的主要问题是您在代码的多个区域中创建字符串作为临时对象 - 这使得它非常低效并且非常慢。另一个问题是您希望将循环中的所有内容外部化。
我已经编译并运行它并且它可以工作。
输出 :
1)桥梁
2)贝吉德
3)桥
Here is my response to this - The main issue I saw with your code is you creating Strings as temporary objects in multiple areas of the code - This makes it very inefficient as well as very slow. The other issue is that you want to externalize all you can from the loops.
I have compiled it and run it and it works.
Output :
1)bridge
2)bergid
3)bridge
快速尝试使用 StringBuilder 执行转置方法,这通常会使此类操作更简单。这似乎适用于您的桥接示例以及奇数长度的字符串。
应该给你足够的想法来自己实现 untranspose 方法:+)
had a quick shot at doing your transpose method using a StringBuilder which usually makes these kind of operations simpler. This seems to work with your bridge example and also Strings of odd length.
Should give you enough ideas to implement the untranspose method yourself :+)
这是一种不需要根据字符串长度是偶数还是奇数而采取不同行为的方法。
Here is a method that does not require different behavior based upon whether the length of the string is even or odd.
好吧,我能够稍微简化
transpose
方法:Update
尝试了 untranspose -
Well, I was able to simplify the
transpose
method a bit:Update
Tried my luck with untranspose -
这是另一个显示转置和非转置之间对称性的解决方案。
Here is another solution that shows the symmetry between transposing and untransposing.
该表达可以很短,但不会变得太难以理解。
The expression can be quite short without becoming too difficult to understand.