我正在尝试学习一些java,我从codefights的一些作业开始,我只是想问一下我的编码技术是否合适?例如,可以使用break in for循环和多个return语句吗?
boolean almostIncreasingSequence(int[] sequence)
{
int i;
int firstTry = 0; /* to indicate the first try */
int secondTry = 0; /* to indicate the second try */
int indexOfBreakingElement = 0; /* to indicate which index of the array is not following the almost increasing sequence */
int sizeOfSequence = sequence.length;
int[] newFixedArray = new int[sizeOfSequence - 1]; /* an array used to store the edited or fixed array for further processing */
for(i = 0; i < sizeOfSequence-1; i++)
{
if(sequence[i] >= sequence[i+1])
{
indexOfBreakingElement = i+1;
firstTry = 1;
break;
}
}
if(firstTry==1)
{
for(i = 0; i < indexOfBreakingElement; i++)
{
newFixedArray[i] = sequence[i];
}
for(i = indexOfBreakingElement+1; i < sizeOfSequence; i++)
{
newFixedArray[i-1] = sequence[i];
}
}
for(i = 0; i < sizeOfSequence-2; i++)
{
if(newFixedArray[i] >= newFixedArray[i+1])
{
indexOfBreakingElement = i;
secondTry = 1;
break;
}
}
if(secondTry==1)
{
for(i = indexOfBreakingElement+1; i < sizeOfSequence; i++)
{
newFixedArray[i-1] = sequence[i];
}
}
for(i = 0; i < sizeOfSequence-2; i++)
{
if(newFixedArray[i] >= newFixedArray[i+1])
{
return false;
}
}
return true;
}
答案 0 :(得分:1)
是的,您的编码技术很好(或至少可以接受)。
在break
循环中使用for
完全正常。事实上,它建议您可能拥有关于Java
的高级知识,因为您已经证明您知道break
将结束循环。
使用return
多次也是如此,因为它表明你知道函数会在return
之后停止运行,这意味着你知道使用多个return
可以提高效率。
此外,您经常使用for
循环表明您习惯使用它们,这很好。您使用i
和j
作为计数器变量可以加强这种印象。
注意:我只想指出使用冗长的变量名称并不是最好的做法,因为你更容易犯一个拼写错误(也就是说,你的变量使用camelCase是好的)。
答案 1 :(得分:0)
我将方法重构为更小的方法,以向您展示我在评论中的含义示例。见下文。多个return
或break
语句以及许多变量都在一个方法中,很难阅读。通过将逻辑分解成更小的部分,它更易于管理。三个步骤 - 找到破坏元素,获取新的固定数组,检查它并根据它看起来返回boolean
。
public boolean isAlmostIncreasing(int[] sequence) {
int[] newFixedArray = toNewFixedArray(sequence);
for (int i = 0; i < newFixedArray.length - 1; i++) {
if (newFixedArray[i] >= newFixedArray[i + 1]) {
return false;
}
}
return true;
}
private int[] toNewFixedArray(int[] sequence) {
int[] newFixedArray = new int[sequence.length
- 1]; /* an array used to store the edited or fixed array for further processing */
int indexOfBreakingElement = findBreakingElementIndex(sequence);
if (indexOfBreakingElement > 0) {
for (int i = 0; i < indexOfBreakingElement; i++) {
newFixedArray[i] = sequence[i];
}
for (int i = indexOfBreakingElement + 1; i < sequence.length; i++) {
newFixedArray[i - 1] = sequence[i];
}
}
for (int i = 0; i < sequence.length - 2; i++) {
if (newFixedArray[i] >= newFixedArray[i + 1]) {
indexOfBreakingElement = i;
for (int j = i + 1; j < sequence.length; j++) {
newFixedArray[j - 1] = sequence[j];
}
break;
}
}
return newFixedArray;
}
private int findBreakingElementIndex(int[] sequence) {
int indexOfBreakingElement = 0;
for (int i = 0; i < sequence.length - 1; i++) {
if (sequence[i] >= sequence[i + 1]) {
indexOfBreakingElement = i + 1;
break;
}
}
return indexOfBreakingElement;
}