390. 消除游戏

本文介绍了如何解决一个数组交替删除元素的问题,直至剩下一个数字。给出的Java和Python代码实现了该算法,通过从左到右和从右到左交替删除元素,最终返回剩余的数字。示例展示了对于不同输入n的处理结果,如n=9时最后剩余数字为6。代码执行效率较高,符合题目要求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

列表 arr 由在范围 [1, n] 中的所有整数组成,并按严格递增排序。请你对 arr 应用下述算法:

  • 从左到右,删除第一个数字,然后每隔一个数字删除一个,直到到达列表末尾。
  • 重复上面的步骤,但这次是从右到左。也就是,删除最右侧的数字,然后剩下的数字每隔一个删除一个。
  • 不断重复这两步,从左到右和从右到左交替进行,直到只剩下一个数字。
    给你整数 n ,返回 arr 最后剩下的数字。

示例 1:

输入:n = 9输出:6解释:
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
arr = [2, 4, 6, 8]
arr = [2, 6]
arr = [6]

示例 2:

输入:n = 1输出:1

提示:

  • 1 <= n <= 109

难度 中

Java实实现

class Solution {
    public int lastRemaining(int n) {
        int remain = n;//剩余数字个数
        Boolean flag = true;//是否从左到右
        int res = 1;//剩余的数字,先假设为第一个
        int step = 1;//step 是用来记录跨度的,因为这里是用一个变量remain模拟而不是真的开辟一个1~n的数组,所以为了模拟中间几个数字被消除了的效果,就需要step
        while( remain > 1){
            // 当左到右 或者剩余个数为奇数。消除第一个
            if( flag ||(remain % 2 == 1))
                res += step;
            //flag = 1-flag;
            flag =!flag;
            step *= 2;
            remain =remain/2;
        }
        return res;    
    }
}

执行结果:
通过
执行用时: 2 ms, 在所有 Java 提交中击败了85.24% 的用户
内存消耗: 37.6 MB, 在所有 Java 提交中击败了24.76% 的用户
通过测试用例:3377 / 3377

Python3实现

class Solution:
    def lastRemaining(self, n: int) -> int:
        #无论从左到右, 还是从右到左,每次都要消除 一半的数
        #但是,从左到右,每次都要消除第一个
        #而从右到左,只要数组为奇数个,才会消除第一个。
        remain = n#剩余数字个数
        flag = True#是否从左到右
        res = 1#剩余的数字,先假设为第一个
        step = 1#step 是用来记录跨度的,因为这里是用一个变量remain模拟而不是真的开辟一个1~n的数组,所以为了模拟中间几个数字被消除了的效果,就需要step
        while remain > 1:
            # 当左到右 或者剩余个数为奇数。消除第一个
            if flag or remain % 2 == 1:
                res += step
            flag = not flag
            step *= 2
            remain //= 2
        return res

执行结果:
通过
执行用时: 32 ms, 在所有 Python3 提交中击败了97.76% 的用户
内存消耗: 15.1 MB, 在所有 Python3 提交中击败了5.22% 的用户
通过测试用例:3377 / 3377

打砖块是一款经典的游戏,通过qt.4可以很容易地实现这个游戏。下面是一个简单的打砖块游戏示例: 首先,我们需要一个主窗口,可以使用QMainWindow类来实现。在主窗口中,我们需要绘制游戏区域和球、板、砖块等游戏元素。可以使用QPainter类来进行绘制。 接着,我们需要定义游戏逻辑。游戏逻辑包括球的运动轨迹、板的移动、砖块的消除等。当球碰到砖块时,砖块会消失,且玩家得分增加。当球碰到板时,球的运动方向会改变。如果球碰到边界,游戏失败。 最后,我们需要添加交互逻辑。玩家可以通过键盘控制板的移动。可以使用QKeyEvent类来实现键盘事件的处理。 下面是一个简单的示例代码,仅供参考: ```cpp #include <QtGui> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); protected: void paintEvent(QPaintEvent *event); void keyPressEvent(QKeyEvent *event); private: int ball_x, ball_y; int ball_dx, ball_dy; int board_x, board_y; int board_dx; int brick[5][10]; int score; void initGame(); void updateGame(); }; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { setFixedSize(400, 400); setWindowTitle("打砖块"); initGame(); QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(updateGame())); timer->start(20); } void MainWindow::paintEvent(QPaintEvent *event) { QPainter painter(this); // 绘制游戏区域 painter.setPen(Qt::black); painter.drawRect(0, 0, 400, 400); // 绘制球 painter.setBrush(Qt::red); painter.drawEllipse(ball_x, ball_y, 10, 10); // 绘制板 painter.setBrush(Qt::blue); painter.drawRect(board_x, board_y, 60, 10); // 绘制砖块 for (int i = 0; i < 5; i++) { for (int j = 0; j < 10; j++) { if (brick[i][j] > 0) { QRect rect(j*40, i*20, 40, 20); painter.setBrush(Qt::green); painter.drawRect(rect); } } } // 绘制得分 painter.setPen(Qt::red); painter.drawText(10, 390, QString("Score: %1").arg(score)); } void MainWindow::keyPressEvent(QKeyEvent *event) { if (event->key() == Qt::Key_Left) { board_dx = -5; } else if (event->key() == Qt::Key_Right) { board_dx = 5; } } void MainWindow::initGame() { ball_x = 190; ball_y = 290; ball_dx = 5; ball_dy = -5; board_x = 170; board_y = 380; board_dx = 0; for (int i = 0; i < 5; i++) { for (int j = 0; j < 10; j++) { brick[i][j] = 1; } } score = 0; } void MainWindow::updateGame() { // 移动球 ball_x += ball_dx; ball_y += ball_dy; // 碰到边界 if (ball_x < 0 || ball_x > 390) { ball_dx = -ball_dx; } if (ball_y < 0) { ball_dy = -ball_dy; } if (ball_y > 390) { initGame(); return; } // 碰到板 QRect rect(board_x, board_y, 60, 10); if (rect.intersects(QRect(ball_x, ball_y, 10, 10))) { ball_dy = -ball_dy; } // 碰到砖块 int row = ball_y / 20; int col = ball_x / 40; if (row >= 0 && row < 5 && col >= 0 && col < 10 && brick[row][col] > 0) { brick[row][col] = 0; ball_dy = -ball_dy; score += 10; } // 移动板 board_x += board_dx; if (board_x < 0 || board_x > 340) { board_dx = 0; } update(); } int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow window; window.show(); return app.exec(); } ``` 在上面的代码中,我们使用了QTimer类来定时更新游戏状态,使用QKeyEvent类来处理键盘事件,使用QPainter类来进行游戏元素的绘制。通过以上的代码,我们就可以打造出一个简单的打砖块游戏了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值