我正在开发一个项目,用户输入奇数二进制数ex:10101,我应该有一个递归方法,将翻转1和0的ex:101 = 010.由于某种原因我的代码摆脱领先的零使得数字成为一个使程序崩溃的偶数。感谢任何和所有帮助,下面是我的递归类,它应该用于翻转二进制数字。
public static void main(String[] args){
String num;
Scanner in = new Scanner(System.in);
System.out.println("Please enter a Binary number with an odd amount of digits: ");
num = in.nextLine();
System.out.println(num);
int num2 = Integer.parseInt(num);
System.out.println(num2);
Recursive2 test = new Recursive2(num2);
System.out.println(test);
}
这是我测试递归的主要类。
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">
<img class="header-logo" style="" src="">SF</a>
</div>
<div class="collapse navbar-collapse pull-right" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li>
<a href="#">About</a>
</li>
<li>
<a href="#">Retrospective</a>
</li>
</ul>
</div>
答案 0 :(得分:0)
你犯了几个错误:
int
并再次String
。整个过程可以完全用字符串完成。修复这些错误将产生正确的实现。
答案 1 :(得分:0)
目前的算法无法修复。
这是一个非常简单的递归算法,它将起作用:
return "1" + recurse(s.substring(1))
return "0" + recurse(s.substring(1))
答案 2 :(得分:0)
问题是你要转换为整数值,它会抛弃前导零。只需处理字符串:
public static void main(String[] args){
String num;
Scanner in = new Scanner(System.in);
System.out.println("Please enter a Binary number with an odd amount of digits: ");
num = in.nextLine();
System.out.println(num);
String flipped;
if (num.length() % 2 == 0) {
flipped = "Even number";
else {
flipped = Recursive2.recursive(num);
}
System.out.println(flipped);
}
Recursive2
类只能有static
个方法:
public class Recursive2 {
private static String flip(char c) {
if (c == '0') return "1";
return "0"; // assumes characters are all 0 or 1
}
public static String recursive(String a) {
STring tempStr;
if (a.length() == 0) {
tempStr = "";
} else {
tempStr = flip(a.charAt(0)) + recursive(a.substring(1));
}
return tempStr;
}
}
如果您检测到0
或1
以外的字符,则可能需要抛出异常。
编辑:根据你的评论,递归方法可以写成:
public static String recursive(String a) {
String tempStr = flip(a.charAt(0));
final int len = a.length();
if (len > 1) {
tempStr += recursive(a.substring(1, len - 1)) + flip(a.charAt(len - 1));
}
return tempStr;
}
这假设参数是一个奇数长度的字符串。该检查应该在递归方法之外完成,因为如果它是真的一次,则在每次后续递归时都是如此。
答案 3 :(得分:0)
忽略前导零,因为您将输入二进制数转换为整数。对于整数前导零并不意味着什么。您应该只使用String
。
同样Integer.parseInt(num);
会假设您要解析十进制数而不是二进制数。如果您确实要解析二进制数,那么您将不得不使用另一个重载方法Integer.parseInt(String s, int radix)
然而正如我所说,由于前导零,你应该只使用字符串。
答案 4 :(得分:0)
我建议你改为从用户插入的字符串中删除一个数字,然后将其转换(从1反比0反之亦然),然后使用子字符串作为递归函数的传递少了一点。
Hint-&GT;基本情况是a.length()== 0;因为如果你删除一个字符串的数字,你的长度最终会为0.
祝你好运!
答案 5 :(得分:0)
Integer.parseInt(i)
会将String
转换为Integer
值。
但Integer
010
的{{1}}值为10
,会导致0's
被删除。
将输入作为String
使用以避免这种情况。
答案 6 :(得分:0)
使用StringBuilder
来避免创建新String
,或者您可以使用char
数组
public static void main(String[] args) {
int no = 1234; // some no
String in = Integer.toBinaryString(no);
System.out.println("Original " + in);
System.out.println("Flipped " + flipBits(in));
}
public static String flipBits(String in) {
if (in.length() % 2 == 0)
return "even length";
return new String(flipBits(in.toCharArray(), in.length() - 1));
}
private static char[] flipBits(char[] ch, int index) {
if (index < 0) {
return ch;
} else {
ch[index] = Character.forDigit(49 - ch[index], 2); //flip
return flipBits(ch, index - 1);
}
}
输出
Original 10011010010
Flipped 01100101101