397.整数替换

题目描述:

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

1. 如果 n 是偶数,则用 n / 2替换 n。

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

问:

n 变为 1 所需的最小替换次数是多少?

可见,该题的难点在于n是奇数时,应该是n+1还是n-1。

解法一:递归

当n==1时,return 0;

将int型的值传给m时,需要将m的类型申明为long long型。因为如果int 型的n为2147483647时,m=(n+1)/2的过程中n+1就会溢出。

int, long int都是4个字节的有符号数,最大值为2147483647.

可以将int型的实参传递给long long型的形参。

class Solution {
public:
    int integerReplacement(long long n) {
        if(n==1) return 0;
        else if(n%2==0) return 1+integerReplacement(n/2);
        else
        {
            long long m=n+1;
            return 2+min(integerReplacement(m/2),integerReplacement((n-1)/2));
        }
    }
};

解法2:利用位运算

 1 class Solution {
 2 public:
 3     int integerReplacement(long long n) {
 4         int res=0;
 5         while(n>3)
 6         {
 7             if(n%2)
 8             {
 9                 n>>=1;
10                 if(n%2)
11                 {
12                     n++;
13                     //res++;
14                 }
15                 res+=2;
16             }//这一个if判断语句中包含了两种情况,举个例子:110111 首先初次判断为奇数,右移一位,相当于-1,再除以2  这时候res=2,n=011011,再次判断为奇数,+1,n=011100  这个结果与最初的n=110111先加1n=111000再右移1位是一样的n=011100 所以这样的操作以后res+=2;
17             //倘若最开始的n=1101,那么初次判断以后为奇数,-1,/2,此时n=0110就不用再进行加1操作了               //(n-1)/2 +1 ==(n+1)/2
18             else
19                 {
20                     n>>=1;
21                     res++;
22                 }
23         }
24         return res+n-1;
25     }
26 };

这道题有一定的技巧,感觉时间是在O(1)(菜鸡瞎猜的,这道题感觉是个脑力题,不仅要求对位运算熟悉,还要求要对整数的二进制表示很熟悉,在leetcode上击败了100%的c++用户,在时间上)

原文地址:https://www.cnblogs.com/yaggy/p/11336972.html

时间: 2024-11-10 15:41:39

397.整数替换的相关文章

[LeetCode] Integer Replacement 整数替换

Given a positive integer n and you can do operations as follow: If n is even, replace n with n/2. If n is odd, you can replace n with either n + 1 or n - 1. What is the minimum number of replacements needed for n to become 1? Example 1: Input: 8 Outp

LeetCode之整数替换

最近在开始做LeetCode的算法题 做的第一题是的题目如下: Given a positive integer n and you can do operations as follow: If n is even, replace n with n/2. If n is odd, you can replace n with either n + 1 or n - 1. What is the minimum number of replacements needed for n to be

leet

# 题名1 两数之和    2 两数相加    3 无重复字符的最长子串    4 寻找两个有序数组的中位数    5 最长回文子串    6 Z 字形变换    7 整数反转    8 字符串转换整数 (atoi)    9 回文数    10 正则表达式匹配    11 盛最多水的容器    12 整数转罗马数字    13 罗马数字转整数    14 最长公共前缀    15 三数之和    16 最接近的三数之和    17 电话号码的字母组合    18 四数之和    19 删除链表

格式化

在Python中,采用的格式化方式和C语言是一致的,用%实现,举例如下: >>> 'Hello, %s' % 'world' 'Hello, world' >>> 'Hi, %s, you have $%d.' % ('Michael', 1000000) 'Hi, Michael, you have $1000000.' 你可能猜到了,%运算符就是用来格式化字符串的.在字符串内部,%s表示用字符串替换,%d表示用整数替换,有几个%?占位符,后面就跟几个变量或者值,顺序

python编码格式

Python的字符串 在最新的Python 3版本中,字符串是以Unicode编码的,也就是说,Python的字符串支持多语言,例如: >>> print('包含中文的str') 包含中文的str 对于单个字符的编码,Python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符: >>> ord('A') 65 >>> ord('中') 20013 >>> chr(66) 'B' >>>

loadrunner提高篇-block(块)技术和参数化

Block(块)技术 block(块)技术是应用于在一个脚本中实现不同事务.不同次数循环或不同百分比循环的情况.比如在一个脚本中,登录执行3次,查询执行1次. 使用方法如下: 1.录制一个脚本,包含2个业务:登录和查询 2.vuser->run time settings->general->run logic,选择run,插入一个block块,然后选择block(),单击insert action按钮,选中要添加的action,如图1所示: 图1(为block添加action) 3.重

Python字符串格式化

1.1.1   字符串的格式化 >>> 'hello,%s' % 'world'    --字符串替换 'hello,world' >>> 'Hi,%s,you salary is $%d' %('DAIDAI',100000)     --字符串替换&整数替换 'Hi,DAIDAI,you salary is $100000' 1.1.1.1  整数的格式化 %d >>> a=7 >>> '%14d abc' % a    

python3.X 复学(9)--字符串和编码(谁懂我的细节)

细节决定成败,一定要记得自己的优缺点.认识自己是一生的事情. -----------hashlinux 字符编码 我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节.比如两个字节可以表示的最大整数是6

Python简明教程---学习笔记

字符双引号括起,数字不括: 分隔符为逗号(,),不能为空格 变量定义时即赋值 采用utf-8编码:#-*-coding:utf-8-*-或者#coding:utf-8 字符串定义:单/双引号括起 %符号用来格式化字符串,"%s"表示用字符串替换,"%d"表示整数替换,"%r"表示不管什么都打印出来 三引号可以指示一个多行字符串,其内可自由使用单双引号 转义符为反斜杠(\),注:行末反斜杠表示字符串在下一行继续不中断 字符串加前缀r或R表示字符串为