这是一个非常酷的序列!我喜欢它基于英语而不是数学(哈哈)。 (尽管现在我想知道......是否有公式可以用于第n个数字?我很确定这是不可能或使用了一些疯狂的数学,但只是值得思考......)
在你的解决方案中,你的代码递归逻辑是正确的:在找到每个数字后,你重复使用新数字的方法并使用该元素找到下一个数字,并在确定第一个 n
个元素时结束。你的基本情况也是正确的。
然而,你开发用于确定序列中的项的算法存在问题。
为了确定序列中的下一个元素,我们希望:
逻辑错误:
创建一个空变量 y
,用于下一个元素。然而,变量 counter
不应该从 0
开始。这是因为每个元素都至少会出现一次,所以我们应该初始化 int counter = 1;
迭代 x
中的字符。(你已经正确执行了这一步)我们从 i=1
开始,因为我们将每个字符与前一个字符进行比较。
如果当前字符等于上一个字符,则将 counter
加 1
。
否则,我们将 counter
和正在重复的字符连接起来,赋给 y
。记住,要将 counter
重新初始化为 1
,而不是 0
。
技术错误:
- 当我们到达迭代
x
的结尾时,我们需要将我们的最终 counter
和字符连接到 y
,因为我们的 for 循环中 else 语句不会运行最后一个字符。
可以使用以下代码完成此操作:y += "" + counter + x.charAt(x.length() - 1);
- 最后,在进行递归调用时,你应该使用
--times
而不是 times--
。这两个参数之间的区别在于,使用原始代码时,你正在进行后缀递减。这意味着方法调用后,times
的值会减少,而我们希望减少的值被发送到方法中。为了解决这个问题,我们需要进行前缀递减,即使用 --times
。
import java.util.*;
class CoolSequence {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
System.out.println(num(n, "1"));
}
public static String num(int times, String x){
if(times == 0){
return x;
}
else{
String y = "";
int counter = 1;
for(int i = 1; i < x.length(); i++){
if(x.charAt(i) == x.charAt(i - 1)){
counter++;
}
else{
y += "" + counter + x.charAt(i - 1);
counter = 1;
}
}
y += "" + counter + x.charAt(x.length() - 1);
return num(--times, y);
}
}
}
测试:
6
13112221
另一种方法是使用迭代法:
import java.util.*;
class CoolSequence2 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
ArrayList<String> nums = new ArrayList<String>();
int n = scan.nextInt();
String val = "1";
for(int i = 0; i < n; i++){
String copy = val;
val = "";
while(!copy.equals("")){
char curr = copy.charAt(0);
int ind = 0;
int cons = 0;
while(ind < copy.length() && curr == copy.charAt(ind)){
cons += 1;
ind += 1;
}
val += String.valueOf(cons) + copy.charAt(cons - 1);
copy = copy.substring(cons);
}
nums.add(val);
}
System.out.println(nums.get(nums.size() - 1));
}
}
6
13112221
在这种方法中,我们使用一个for循环来迭代n个项。为了确定每个元素,我们使用类似于您的逻辑的方法:
- 我们创建一个空字符串val来保存新元素,并将当前元素存储在复制中。我们还初始化了一个cons,类似于您的计数器。
- 当复制不为空时,我们遍历复制并增加cons,直到有一个元素不等于下一个元素。
- 当这种情况发生时,我们将cons和重复的元素连接起来放入val中,就像您的代码一样。然后,我们从复制中剪切出重复的元素并继续这个过程。
- 我们将val的新值添加到nums中,并继续迭代n个元素。
希望这两种方法能帮助你解决问题!如果您有任何进一步的问题或需要澄清,请告诉我 :)