当前位置: 首页 > 知识库问答 >
问题:

为什么我的算法不检查linkedlist的最后一个元素?

华俊弼
2023-03-14

我做了一个小系统,它需要一个座位数来填满电影院一定数量的座位(没有排)。现在我做了一个填充座位并返回地图的方法,地图返回在什么位置有一定数量的座位是空闲的(例如3-2意味着从位置3开始有两个相邻的座位)。

这很有效,但如果我说最多有5个座位,而座位5是免费的,那么该方法不会将其返回到地图。

以下是使用的代码:

对象座椅

public class Seat {
    public Integer availability;
    public Integer seatNumber;

    public boolean IsFree() {
        if(availability == 0){
            return true;
        }
        else return false;
    }

    public String toString() {
        return "{ " + seatNumber + ", free: " + IsFree() + " } ";
    }
}

此方法创建一个LinkedList,并通过giveRandomAvailability()方法使用“1”(已获取)或“0”(可用)填充可用性

static LinkedList fillList(int seats){

    LinkedList<Seat> list = new LinkedList<Seat>();
    seats = seatCount;

    for(int i = 0; i < seats; i++){
        Seat seat = new Seat();
        seat.availability = giveRandomAvailability();
        seat.seatNumber = (i + 1);
        list.add(seat);
    }

    return list;
}

这是一种不能正常工作的方法,它应该用可用的座位填充地图,但当最后一个元素可用时,它不会映射。以下是一个示例输出:

[{ 1, free: true } , { 2, free: true } , { 3, free: false } , { 4, free: true } , { 5, free: true } ]
{1=2}

您可以看到,第一部分处理得很好,但它还应该包含4=2。

方法

static Map fillSeats(){
    int n = 3;
    LinkedList<Seat> newList = fillList(seatCount);
    int consecutiveLength = 0; // Consecutive free seats length
    int index = 0;
    int startIndex = -1; // Store the start of consecutive free seats
    System.out.println(newList.toString());
    Map<Integer, Integer> consecutiveMap = new HashMap<>(); // Store startIndex -> length

    for (Seat seat : newList) {
        if (seat.IsFree()) {
            if (startIndex < 0) {
                startIndex = index;
            }
            consecutiveLength ++;
        } else {
            consecutiveMap.put(startIndex + 1, consecutiveLength);
            if (consecutiveLength == n) {
                // Found, do something here
            }
            // Reset
            startIndex = -1;
            consecutiveLength = 0;
        }
        index++;
    }
    return consecutiveMap;
}

我在这里找不到问题,非常感谢您的帮助。

共有2个答案

司徒俊良
2023-03-14

您对连续映射的调用。put只存在于循环的else子句中,并且由于列表中的最后一个元素是自由的,因此该代码永远不会在最后两个席位上执行。

  1. 座位。IsFree()==true,增量计数器
  2. 座位。IsFree()==true,增量计数器
  3. seat.isFree()==false,为映射加值,重置计数器
  4. seat.isFree()==true,增量计数器
  5. seat.isFree()==true,增量计数器

然后循环终止,因此最终计数器不会添加到映射中。

巫晋鹏
2023-03-14

嗯,如果最后一组连续座位包含列表的最后一个元素,那么循环不会添加该组连续座位。您应该在循环后添加逻辑以添加最后一个组:

for (Seat seat : newList) {
    if (seat.IsFree()) {
        if (startIndex < 0) {
            startIndex = index;
        }
        consecutiveLength ++;
    } else {
        consecutiveMap.put(startIndex + 1, consecutiveLength);
        if (consecutiveLength == n) {
            // Found, do something here
        }
        // Reset
        startIndex = -1;
        consecutiveLength = 0;
    }
    index++;
}
// added logic:
if (startIndex >= 0) {
    consecutiveMap.put(startIndex + 1, consecutiveLength);
}
return consecutiveMap;
 类似资料:
  • 问题内容: 我有这种方法,可以在登录前检查用户名和密码。现在,我的for循环仅检查第一个项目,它发现第一个项目不满足第一个条件,因此与其去检查第二个项目,它只是中断并返回null。 为什么会这样? 这是我的方法: 问题答案: 因此,请尝试此代码。

  • 问题内容: 我发布此消息是因为该主题刚刚在另一个问题/答案中提出,并且该行为没有得到很好的记录。 考虑数据框 我想获取由column定义的每个组的第一行和最后一行。 我试过了 但是,这并没有给我我所期望的。 如何获得每个组中的实际第一个和最后一个值? 问题答案: 一种选择是使用该方法: 但是,我还没有找到一种将它们整齐地聚合的方法。当然,总是可以使用构造函数: 注意:我明确使用了该属性,否则您必须

  • 当单击的elemenet是父元素的最后一个子元素时,我要显示报警。我的HTML结构: 在本例中,我希望在单击该元素(父行的最后一个元素)时显示报警: 我知道我可以使用这样的somethink获得最后一个元素(但我不能在我的例子中使用这个): 我想试着做这样的事,但每次都是假的

  • 我是Java初学者,目前正在完成有关DSA的Udemy课程。我正在学习链表,并且正在研究在链表中插入和删除节点的方法。 从我所学到的到目前为止,我知道我们使用条件来检查链接列表是否是空的。 如果条件为true,则LinkedList为空,否则它不为空。 然而,我们不应该检查是否,因为尾巴将始终引用LinkedList中的最后一个节点,即使我们使? 这是我的密码:

  • 问题内容: 我想知道对for循环中的最后一个元素进行特殊处理的最佳方法(更紧凑和“ pythonic”的方法)。有一段代码只应 在 元素 之间 调用,而在最后一个代码中被禁止。 这是我目前的操作方式: 有什么更好的办法吗? 注意:我不希望使用hack之类的东西。 问题答案: 在大多数情况下,使第 一个 迭代成为特殊情况而不是最后一个案例更容易(且更便宜): 这将适用于任何迭代过程,即使对于那些没有

  • py代码如下: 参考py写的node.js代码如下 node.js 的解密参数全是和py的一样,打印出来的key也是一样的,说明makeKey方法是一样的, 就是接下来的rc4解密,不知道是我node.js哪里写的不对,最后解密出来的verifierHash和 hash 不一样,求大神解答下,是不是node.js这里的rc4解密有问题导致的,还是哪里有问题?