首页 > 其他分享 >397. 整数替换 (Medium

397. 整数替换 (Medium

时间:2023-02-28 17:45:57浏览次数:50  
标签:cnt Medium 示例 int 397 替换

问题描述

397. 整数替换 (Medium)

给定一个正整数 n ,你可以做如下操作:

  1. 如果 n 是偶数,则用 n / 2 替换 n
  2. 如果 n 是奇数,则可以用 n + 1n - 1 替换 n

返回 n 变为 1 所需的 最小替换次数 。

示例 1:

输入:n = 8
输出:3
解释:8 -> 4 -> 2 -> 1

示例 2:

输入:n = 7
输出:4
解释:7 -> 8 -> 4 -> 2 -> 1
或 7 -> 6 -> 3 -> 2 -> 1

示例 3:

输入:n = 4
输出:2

提示:

  • 1 <= n <= 2³¹ - 1

解题思路

贪心的思想。这里只需要讨论n为奇数的情况,如果n为奇数,那么n + 1n - 1必然有一个能被4整除,如果(n + 1) % 4 == 0,那么n = n + 1,否则n = n - 1,注意3是例外。

代码

class Solution {
  public:
    int integerReplacement(int n) {
        int cnt = 0;
        while (n != 1) {
            while ((n & 1) == 0) { // n为偶数
                n >>= 1;         // 相当于除以2
                cnt++;
            }
            if (n == 1) {
                return cnt;
            }
            if (n == 3)
                return cnt + 2;
            if ((n + 1) & 3 == 0) { // n能被4整除
                n += 1;
                cnt++;
            } else {
                n -= 1;
                cnt++;
            }
        }
        return cnt;
    }
};

标签:cnt,Medium,示例,int,397,替换
From: https://www.cnblogs.com/zwyyy456/p/17165333.html

相关文章

  • 1238. 循环码排列 (Medium)
    问题描述1238.循环码排列(Medium)给你两个整数n和start。你的任务是返回任意(0,1,2,,...,2^n-1)的排列p,并且满足:p[0]=startp[i]和p[i+1]的二进制表示形......
  • 1792. 最大平均通过率 (Medium)
    问题描述1792.最大平均通过率(Medium)一所学校里有一些班级,每个班级里有一些学生,现在每个班都会进行一场期末考试。给你一个二维数组classes,其中classes[i]=[pass......
  • 132 模式 (Medium)
    问题描述456.132模式(Medium)给你一个整数数组nums,数组中共有n个整数。132模式的子序列由三个整数nums[i]、nums[j]和nums[k]组成,并同时满足:i<j<k......
  • 1139. 最大的以 1 为边界的正方形 (Medium)
    问题描述1139.最大的以1为边界的正方形(Medium)给你一个由若干0和1组成的二维网格grid,请你找出边界全部由1组成的最大正方形子网格,并返回该子网格中的元素......
  • 1218.最长定差子序列 (Medium)
    问题描述1218.最长定差子序列(Medium)给你一个整数数组arr和一个整数difference,请你找出并返回arr中最长等差子序列的长度,该子序列中相邻元素之间的差等于differ......
  • 334. 递增的三元子序列 (Medium)
    问题描述334.递增的三元子序列(Medium)给你一个整数数组nums,判断这个数组中是否存在长度为3的递增子序列。如果存在这样的三元组下标(i,j,k)且满足i<j<k......
  • vim 替换
    命令:substitude:s/{from}/{to}其中s为substitude:s/{from}/{to}当前行的第一个from替换为to:s/{from}/{to}/g将当前行中的from替换为to:s/{from}/{to......
  • C# 文本文件的查找及替换(WinForm)
    usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.IO;usingSystem.Linq;using......
  • sed命令的使用(替换)
    sed命令使用场景当你经历下面场景的时候你应该学会使用现在有多个文件,要对文件中同样的内容进行替换,要替换称相同的内容。一个一个打开文件从而进行修改,这个方法可以但......
  • 4.10-替换算法
    需要替换算法的原因程序运行一段时间后,Cache存储空间被占满,当再有新的数据要调入时,就需要通过某种机制决定替换的对象集中常见的替换算法先进先出-FIFO最不经常使用......