数字与位操作——168、670、233、357、400

news2024/9/25 17:15:24

168. Excel表列名称(简单)

给你一个整数 columnNumber ,返回它在 Excel 表中相对应的列名称。

例如:

A -> 1
B -> 2
C -> 3
...
Z -> 26
AA -> 27
AB -> 28 
...

示例 1:

输入:columnNumber = 1
输出:"A"

示例 2:

输入:columnNumber = 28
输出:"AB"

示例 3:

输入:columnNumber = 701
输出:"ZY"

示例 4:

输入:columnNumber = 2147483647
输出:"FXSHRXW"

提示:

  • 1 <= columnNumber <= 2^31 - 1

解法一、进制转换

相当于26进制中0-25变成了1-26,每轮开始之前减回去就好

class Solution {
public:
    string convertToTitle(int columnNumber) {
        string ans;
        while(columnNumber) {
            --columnNumber;
            int re = columnNumber % 26;
            ans.push_back('A' + re);
            columnNumber /= 26;
        }
        reverse(ans.begin(), ans.end());
        return ans;
    }
};

670. 最大交换(中等)

给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。

示例 1 :

输入: 2736
输出: 7236
解释: 交换数字2和数字7。

示例 2 :

输入: 9973
输出: 9973
解释: 不需要交换。

注意:

  1. 给定数字的范围是 [0, 10^8]

解法一、暴力

i从前往后,j从后往前,寻找最大值。当最大值有复数个的时候,找最后一个。

第二个循环交换,时间复杂度O(n^2)

class Solution {
    public static int maximumSwap(int num) {
        String a = String.valueOf(num);
        StringBuffer sb = new StringBuffer();
        int left = -1,right = -1;
        for(int i = 0;i<a.length();i++){
            for(int j = a.length()-1;j > i;j--){
                if(a.charAt(j) > a.charAt(i) && (right == -1 || a.charAt(j) > a.charAt(right))){
                    left = i;
                    right = j;
                }
            }
            if((left ^ right) != 0)break;
        }
        for(int i = 0;i < a.length();i++){
            if(i == left){
                sb.append(a.charAt(right));
            } else if(i == right) {
                sb.append(a.charAt(left));
            }else{
                sb.append(a.charAt(i));
            }
        }
        return Integer.parseInt(sb.toString());
    }
}

解法二、枚举

其实就是全转一遍,一共有28种方法。感觉这个转字符组然后swap的方式很有意思

class Solution {
    public int maximumSwap(int num) {
        char[] charArray = String.valueOf(num).toCharArray();
        int n = charArray.length;
        int maxNum = num;
        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j < n; j++) {
                swap(charArray, i, j);
                maxNum = Math.max(maxNum, Integer.parseInt(new String(charArray)));
                swap(charArray, i, j);
            }
        }
        return maxNum;
    }

    public void swap(char[] charArray, int i, int j) {
        char temp = charArray[i];
        charArray[i] = charArray[j];
        charArray[j] = temp;
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/maximum-swap/solutions/1818457/zui-da-jiao-huan-by-leetcode-solution-lnd5/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

解法三、贪心

和解法一差不多,但是只需要一次循环。从右往左遍历,用maxId记录最大值的下标,其中满足(如果最大值只有一个,记录最大值;如果最大值有多个,记录最靠右的)。之后再往左看,一旦有小的就更新,记录值对。

class Solution {
    public int maximumSwap(int num) {
        char[] charArray = String.valueOf(num).toCharArray();
        int n = charArray.length;
        int maxIdx = n - 1;
        int idx1 = -1, idx2 = -1;
        for (int i = n - 1; i >= 0; i--) {
            if (charArray[i] > charArray[maxIdx]) {
                maxIdx = i;
            } else if (charArray[i] < charArray[maxIdx]) {
                idx1 = i;
                idx2 = maxIdx;
            }
        }
        if (idx1 >= 0) {
            swap(charArray, idx1, idx2);
            return Integer.parseInt(new String(charArray));
        } else {
            return num;
        }
    }

    public void swap(char[] charArray, int i, int j) {
        char temp = charArray[i];
        charArray[i] = charArray[j];
        charArray[j] = temp;
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/maximum-swap/solutions/1818457/zui-da-jiao-huan-by-leetcode-solution-lnd5/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

233. 数字 1 的个数(困难)

给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。

示例 1:

输入:n = 13
输出:6

示例 2:

输入:n = 0
输出:0

提示:

  • 0 <= n <= 10^9

解法一、分类讨论

见↓

. - 力扣(LeetCode)

class Solution {
    public int countDigitOne(int n) {
        int m = 1;
        int ans = 0;
        while (n >= m){
            ans += (1+(n/m-1)/10)*m;
            if (n/m%10 == 1) ans = ans-m+1+n%m;
            m *= 10;
        }
        return ans;
    }
}

作者:嘉然
链接:https://leetcode.cn/problems/number-of-digit-one/solutions/937955/gong-shi-tui-dao-qiu-mei-yi-wei-shang-1d-5qvu/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


357. 统计各位数字都不同的数字个数

给你一个整数 n ,统计并返回各位数字都不同的数字 x 的个数,其中 0 <= x < 10n 。

示例 1:

输入:n = 2
输出:91
解释:答案应为除去 11、22、33、44、55、66、77、88、99 外,在 0 ≤ x < 100 范围内的所有数字。 

示例 2:

输入:n = 0
输出:1

提示:

  • 0 <= n <= 8

解法一、打表

抖个机灵(

解法二、排列组合

0位有一个(0),个位有十个(0-9),再往上,例如两位数,有9*9,三位数有9*9*8···

class Solution {
    public int countNumbersWithUniqueDigits(int n) {
        if (n == 0) {
            return 1;
        }
        if (n == 1) {
            return 10;
        }
        int res = 10, cur = 9;
        for (int i = 0; i < n - 1; i++) {
            cur *= 9 - i;
            res += cur;
        }
        return res;
    }
}

解法三、动态规划 

状态转移方程

dp[i]=dp[i-1]+(dp[i-1] - dp[i-2]) * (10 - (i-1))

class Solution {
    //对于1位数,全都可以,10。二位数,9*9.对于三位数,9*9*8 对于四位数 9*9*8*7
    public int countNumbersWithUniqueDigits(int n) {
        if(n ==0)return 1;
       int[] dp = new int[n+1];
       dp[0] = 1;
       dp[1] = 10;
       for(int i = 2;i <= n;i++){
           dp[i] = dp[i-1] + (dp[i-1]-dp[i-2])*(11-i);
       }
       return dp[n];
    }
}

400. 第 N 位数字

给你一个整数 n ,请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...] 中找出并返回第 n 位上的数字。

示例 1:

输入:n = 3
输出:3

示例 2:

输入:n = 11
输出:0
解释:第 11 位数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是 0 ,它是 10 的一部分。

提示:

  • 1 <= n <= 2^31 - 1

解法一、模拟遍历 

这次真有点在乱命名了···i是位数,t是模拟那个9/90/900的每位数总值,pre是sum的上一格记录。while里确认区间,n所在的位置是[pre,sum],然后回退超出了一格的i,减pre把n在本位上多出来的留出。k计算余数(这里用了168题的算法,对于只有1——n而非0——n-1的数字,求余应该是(x-1) %t +1),num是最终的数字。用最后一行把num的个位变成所求位,返回10的余数(即个位)。

class Solution {
    //1-9 1 10-99 2/ 180 100-999 3/2700 1000-9999 4 36000
    //181 如果是50 对应的是2位数
    // 9 90 900 9000 90000 900000
    public static int findNthDigit(int n) {
        if(n < 10)return n;
        long pre = 0;
        long sum = 0,i = 1,t = 9;
        while(sum < n){
            pre = sum;
            sum += t * i;
            t*=10;
            i++;
        }
        i--;
        n -=pre;
        long k = (n-1) % i + 1;
        long num = t / 90 + (n-1) / i;//假如是59987的第四位,i = 5,num = 59987,k = 4;
        num /=(int) Math.pow(10,i-k);
        return (int)num % 10;

    }
}

 

题解区更明确的。(这个while的目的一致,写法不同)

public int findNthDigit(int n) {
        int digit = 1;   // n所在数字有几位数
        long start = 1;  // 每digit位的起始数字,1位数从2开始,2位数从10开始..
        long count = 9;  // 所有digit位数的数位数量, 所有1位数有9个位,所有的2位数90x2个位..
        // 1. 确定n所在的数字的位数digit
        while (n > count) { 
            n -= count; // n分别减去1位数 2位数 3位数的个数..
            digit += 1;
            start *= 10;
            count = 9 * start * digit; 
        } 
        long num = start + (n - 1) / digit; // 2. 确定n所在的数字num,n-1是从0开始计算偏移量 
        int x = (n - 1) % digit; // 3. 确定所求数位是 num 的第几位数字,从0算起
        // 从num中分割出第x位,如 num = 1234, x = 1, 需割掉2位数,再求模可得2
        int times = digit - (x + 1);
        for (int i = 0; i < times; i++) num /= 10; 
        return (int)(num % 10);
    }

 


碎碎念

  • 168学到了1-n位进制转换,670学会了单向遍历,233挺难的考察分类讨论,357靠自己写出了动态规划,400要考虑的太碎了,很多边界情况。。。。
  • 明天开始出门!路上两天,休息一周多点,再之后回学校了~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1975767.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[NISACTF 2022]ezstack-入土为安的第十四天

签到题吧 checksec pwn 没有保护 进入main函数&#xff0c;点进shell &#xff0c;buf 88808048buf system 08048512 /bin/sh 0804A024 直接让代码溢出调用system和/bin/sh from pwn import *# 连接到远程服务 p remote(node5.anna.nssctf.cn, 20789)# 构造 payload payl…

第三期书生大模型实战营之Llamaindex RAG实践

基础任务 任务要求&#xff1a;基于 LlamaIndex 构建自己的 RAG 知识库&#xff0c;寻找一个问题 A 在使用 LlamaIndex 之前InternLM2-Chat-1.8B模型不会回答&#xff0c;借助 LlamaIndex 后 InternLM2-Chat-1.8B 模型具备回答 A 的能力&#xff0c;截图保存。 streamlit界面…

OS_进程

2024.06.25&#xff1a;操作系统进程学习笔记 第6节 进程 6.1 进程的定义6.2 进程的基本特征&#xff08;动态、并发、独立、异步&#xff09;6.3 机器状态&#xff08;进程可以读取/更新的内容&#xff09;6.3.1 虚拟化技术6.3.2 进程的地址空间&#xff08;虚拟存储器技术要学…

基于OpenCV-Python的彩色图像傅里叶变换

如果用OpenCV-Python进行图像的离散傅里叶变换与逆变换其实还蛮简单的&#xff0c;流程就是上图所示&#xff0c;值得注意的是&#xff0c;如果是多通道的图像&#xff0c;譬如多光谱、高光谱图像&#xff0c;需要对每个通道都进行傅里叶变换&#xff0c;最后再聚合&#xff0c…

数字乡村 | 是什么、建什么、怎么建?附200份详尽解决方案下载

数字乡村是什么 如何将数字乡村建设与全面实施乡村振兴战略有效衔接&#xff0c;已成为当前农业农村工作的重要课题。 200份资料下载方式&#xff0c;请看每张图片右下角信息 数字乡村作为一种新的乡村社会发展形态&#xff0c;是当今第四次工业革命工业互联网 生态系统的持…

如何在Java中调用数学中的log函数

在Java中&#xff0c;调用数学中的对数&#xff08;log&#xff09;函数通常是通过Math类来实现的。Math类提供了多种对数函数的实现&#xff0c;但最常用的是自然对数&#xff08;底数为e的对数&#xff09;和以10为底的对数。 自然对数&#xff08;底数为e&#xff09; 使用…

深度学习之参数初始化问题

参数初始化 1、 参数初始化可以减缓梯度爆炸和梯度消失问题 2、tanh一般使用Xavier初始化方法 3、Relu及其变种使用Kaiming初始化方法 V a r ( X ) E ( X 2 ) − E ( X ) 2 V a r ( X Y ) V a r ( X ) V a r ( Y ) , 当 X 和 Y 互相独立 V a r ( X Y ) V a r ( X ) V a r…

【机器学习基础】Scikit-learn主要用法

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科&#xff0c;通过算法和模型让计算机从数据中学习&#xff0c;进行模型训练和优化&#xff0c;做出预测、分类和决策支持。Python成为机器学习的首选语言&#xff0c;…

C语言 ——— 学习、使用 strstr函数 并模拟实现

目录 strstr函数的功能 学习strstr函数​编辑 使用strstr函数 模拟实现strstr函数 strstr函数的功能 在字符串 str1 中找 str2 字符串&#xff0c;如果在 str1 字符串中找到了 str2 字符串&#xff0c;就返回 str1 中找到的 dtr2 的地址&#xff0c;没找到的话就返回 NU…

[CR]厚云填补_MSDA-CR

Cloud Removal in Optical Remote Sensing Imagery Using Multiscale Distortion-Aware Networks Abstract 云层污染是光学遥感图像中常见的问题。基于深度学习的遥感图像去云技术近年来受到越来越多的关注。然而&#xff0c;由于缺乏对云失真效果的有效建模和网络较弱的特征表…

EasyMR如何为服务开启Kerberos

作者&#xff1a;雅泽 一、Hadoop为什么需要安全 最早部署Hadoop集群时并没有考虑安全问题&#xff0c;未开启安全认证时&#xff0c;Hadoop 是以客户端提供的用户名作为用户凭证&#xff0c; 一般即是发起任务的Unix 用户。一般线上机器部署服务会采用统一账号&#xff0c;当…

CPU与Load

1、CPU和LOAD分别是什么load就是负载吗&#xff0c;跟CPU啥关系&#xff0c;啥区别 CPU和Load&#xff08;负载&#xff09;是衡量计算机系统性能的两个重要指标&#xff0c;但它们关注的侧重点和意义不同。理解这两个指标及它们之间的关系对于系统优化和性能监控非常重要。 CP…

【C++】数组案例 五只小猪称体重

题目&#xff1a;给出物质小猪体重&#xff0c;找出最大的体重的值并打印 思路&#xff1a;利用菽粟写入五只小猪的体重&#xff0c;让每一个元素都赋值给一个整型变量并每赋值一次就于下一个数组中的元素比&#xff0c;若是大就继续赋值给这个变量&#xff0c;若是小则不赋值…

【QT】qss

目录 基本语法 设置全局样式 问题 分离样式代码 方案1 方案2 选择器 概况 子控件选择器 伪类选择器 盒子模型 修改控件样式示例 按钮 属性小结 复选框 属性小结 输入框 属性小结 列表框 属性小结 渐变色 示例&#xff1a; 菜单栏 设置菜单栏的背景…

clang 编译cuda原理

背景 最近在看一门julia的语言&#xff0c;里面是原生支持cuda的&#xff0c;不过在国产卡上却无法适配&#xff0c;为了开展工作有必要了解非常清楚整个编译的机制。此外在研究过程中发现openai 的triton&#xff0c;以及tvm等一些ai框架对nvidia的支持原理都及其类似&#x…

LinkedList接口源码解读

LinkedList 接口源码解读&#xff08;一&#xff09; 前言 因为追求质量&#xff0c;所以写的较慢。大概在接下来的三天内会把LinkedList源码解析出完。大概还有两篇文章。废话不多说&#xff0c;正片开始&#xff01; 大家都知道&#xff0c;LinkedList是在Java底层中是由 …

【C++标准模版库】模拟实现vector+迭代器失效问题

模拟实现vector 一.vector成员变量二.构造函数1.无参&#xff08;默认&#xff09;构造2.有参构造3.拷贝构造1.传统写法2.现代写法 三.vector对象的容量操作1.size2.capacity3.clear4.empty5.reserve6.resize 四.vector对象的访问及遍历操作1.operator[]2.实现迭代器&#xff1…

一次Linux端口冲突问题排查记录

更多技术博客&#xff0c;请关注微信公众号&#xff1a;运维之美 一、问题现象 实施同学反馈说我们的服务部署到客户环境后&#xff0c;运行正常&#xff0c;但是后台页面就是无法打开&#xff0c;出现访问白屏问题 从console报错看是其中一个接口响应存在问题&#xff0c;…

老兵永远跟党走,团结奋进新征程-百余老兵庆八一暨《永远闪光的军徽》新书发布座谈会在昆举行

7月30日上午,由中国红色文化研究会老山精神专业委员会主办,昆明乡羊香园承办的百余老兵庆祝“八一”建军节暨《永远闪光的军徽》新书发布座谈会在昆明滇池湖畔乡羊香园举行。 上午10时左右,老战士、曾担任云南省军区领导的黄光汉、陶昌廉、和志光、李继才、雷玉德、王永银老将军…

海思Hi35XX系列(一)环境搭建与挂载

小白一个&#xff0c;新的开发板刚到手有点懵&#xff0c;之前没弄过没有经验&#xff0c;简单记录一下吧 一般买开发板都会给带一个已经配置好的虚拟机文件&#xff0c;直接使用就可以 一、下载安装虚拟机与镜像文件 VMware-workstation16.1.0 我的镜像文件是官方文档资料…