栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

LeetCode高频题:如何不用int转字符数组,实现int类型数字x的第L位和R位数字交换

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode高频题:如何不用int转字符数组,实现int类型数字x的第L位和R位数字交换

LeetCode高频题:如何不用int转字符数组,实现int类型数字x的第L位和R位数字交换?

提示:本题是系列LeetCode的150道高频题,你未来遇到的互联网大厂的笔试和面试考题,基本都是从这上面改编而来的题目
互联网大厂们在公司养了一大批ACM竞赛的大佬们,吃完饭就是设计考题,然后去考应聘人员,你要做的就是学基础树结构与算法,然后打通任督二脉,以应对波云诡谲的大厂笔试面试题!
你要是不扎实学习数据结构与算法,好好动手手撕代码,锻炼解题能力,你可能会在笔试面试过程中,连题目都看不懂!比如华为,字节啥的,足够让你读不懂题


文章目录
  • LeetCode高频题:如何不用int转字符数组,实现int类型数字x的第L位和R位数字交换?
    • @[TOC](文章目录)
  • 题目
  • 一、审题
  • 通过取数字,简单的加减法搞定
    • 怎么把L和R那俩数字取出来
  • 有了numL和numR,我们怎么直接在int类型上完成数字交换呢???
  • 总结
题目

如何不用int转字符数组,实现int类型数字x的第L位和R位数字交换?


一、审题

x=123456789
将L=7,R=2处的数字交换?
y=173456289


通过取数字,简单的加减法搞定 怎么把L和R那俩数字取出来

这很好办!
除法,取模就能搞定

比如把x=123456789中的R=2位置的那个7取出来
只需要将x/100%10即可
其实就是把01两个数字抹掉,就是除法呗
然后剩下x=1234567
这个直接模10即可x%10=7这是再简单不过的运算了

既然是R=2的时候,需要先除100,那就是1后头跟R个零
我们把除数100,还是10的多少次方,都准备好,万一你要取别的位置呢?那就需要除别的数

这样:
准备一个
arr=1,10,100,1000,10000,100000,1000000,10000000,100000000
1后面最多跟8个0
arr[L]就代表1后面跟了L个0

比如你要取x=123456789中的L=8位置的那个1取出来
自然是要让你先把x/10的8次方,然后再模10取
x/100000000=1,1%10=1
这样就把1取出来了

容易吧!

所以呢,将x中L和R取出来
只需要2行代码:

numL=x/arr[L]%10
numR=x/arr[R]%10
有了numL和numR,我们怎么直接在int类型上完成数字交换呢???

x=123456789
将L=7,R=2处的数字交换?
y=173456289

也不难,就是简单的加减法推算

我们不是想把L换成R吗???
很容易,x直接减掉[L]-[R] * 10的L次方

怎么理解?
你就是想让L变R呗,那我在L位置,减去一个[L]-[R],不就是R了吗
因为[L]-([L]-[R])=[R]
来看例子:你想让7变2,不就一个差的事情吗?7-(7-2)=7 - 5 = 2
可不就是把7变成2了吗?

只不过呢,我们别忘了后面还要跟一堆0,L个0
直接调用arr[L]就是1后面跟L个0

看例子:x的L=7位置那个2,变R=2位置的7
先让2-7=-5,再乘10的L=7次方,
让x-(-5)*10的7次方
就是a=173456789
这样的话L那个位置的2就变成了7了

好,现在a要怎么搞才能让R=2处的7变2呢??
同理
我直接让a加上[L]-[R] * 10的R次方

怎么说?2-7 * 10的2次方=-500
a-500=173456289

这样的话,刚刚好,就把x的L=7位置和R=2位置的俩数字交换了
完成了int类型的LR交换

所以手撕代码搞定这事:

    //就把x的L=7位置和R=2位置的俩数字交换了
    public static final int[] arr = {1,10,100,1000,10000,100000,1000000,10000000,100000000};
    //准备好常量arri表示1后面跟i个0

    public static int swap(int x, int L, int R){
        //将x的L和R处数字交换
        //首先把L和R处数字提取出来,就可以利用加减法换L和R
        int numL = x / arr[L] % 10;
        int numR = x / arr[R] % 10;
        //L这里是x-([L]-[R])*10的L次方=a
        //R这里是a+([L]-[R])*10的R次方
        int a = x - (numL - numR) * arr[L];//完成L变R
        int b = (numL - numR) * arr[R];//完成R变L

        return a + b;//最终L和R调换,以后千万别把int转char[],这样很费时间的
    }

测试一把:

    public static void test(){
        int x = 123456789;
        System.out.println(swap(x, 7, 2));
    }

    public static void main(String[] args) {
        test();
    }

一绝啊

173456289

不管你L,R谁大,都是左边-右边,乘10的n次方

不会出问题的
比如:下面1跟9换
虽然1小,但是1-9=-8
a是num-(-8)乘10的6次方,其实1就变9了
b是a+(-8)乘10的3次方,其实9就变1了,一切OK


总结

提示:重要经验:

1)int类型中L和R位置的数字交换,千万别把int转char[]然后再交换,再转化为int类型的数字,还需要for循环倍乘去加,速度不快
2)通过简单的除法取模,把LR数字取出来,然后拿着这俩数,通过简单的减法,把L换位R,然通过加法,把R换位L,a+b就是咱们交换LR的int结果,速度极其快。
3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1007393.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号