【算法训练】Leetcode 1295. 统计位数为偶数的数字(2020.06.09 )

1 题目

1295. 统计位数为偶数的数字

给你一个整数数组 nums,请你返回其中位数偶数 的数字的个数


示例 1:

输入:nums = [12,345,2,6,7896]
输出:2
解释:
12 是 2 位数字(位数为偶数)
345 是 3 位数字(位数为奇数)
2 是 1 位数字(位数为奇数)
6 是 1 位数字 位数为奇数)
7896 是 4 位数字(位数为偶数)
因此只有 12 和 7896 是位数为偶数的数字


示例 2:

输入:nums = [555,901,482,1771]
输出:1
解释:
只有 1771 是位数为偶数的数字。


提示:

1 <= nums.length <= 500
1 <= nums[i] <= 10^5


来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-numbers-with-even-number-of-digits
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


2 分析

  1. 求整数位数(可求!有方法!
  2. 位数是不是偶数
求整数位数的方法
  1. 直接使用整数求长度
  2. 转换为字符串求长度

提示:
1 <= nums.length <= 500
1 <= nums[i] <= 10^5

这是关键信息

  • 数组个数最多500
  • 每个元素最多10000

备注:此处,官网的输入测试用例居然有100000,这应该是bug,不用理会。

关注限定条件!

  • 数少的,甚至可以手算
  • 数较多的,需要一般算法
  • 数量极大的,需要高级算法

3 代码

3.1 按照int求长度

极其简单!
假定传入int n

C++代码:

while(n != 0){count++;n /= 10;
}
适用范围:所有整数(正数,0,负数)

在这里插入图片描述

3.2 转换为字符串求长度

先将int转换为字符串,然后直接求出长度,看看是不是偶数,一个表达式到位,这里只求长度。

Java代码:

int n = -100;
System.out.println(String.valueOf(n).length());
适用范围:自然数(正数数,0)

负数不行!因为有“-”,Because it has a minus sign.

3.3 题解

3.3.1 直接求(若可以输入0,就会有问题)

框架思维

public int findNumbers(int[] nums) {int result = 0;  // 我要得到的结果存在这里return result;  // 返回这个结果}

Java

public int findNumbers(int[] nums) {int result = 0;int digitCount = 0;for(int i:nums){digitCount = 0;while(i != 0){digitCount++;i /= 10;}if(digitCount % 2 == 0)result++;}return result;}

面向对象:Every element in the array ‘nums’.
核心结构:求int的位数

思路框架

  • 遍历每一个元素
    • 求整数位数
    • 看看是不是偶数

不管数据有多大,只要是整数,都可以(除了0)!但是数据太大的话,就太慢了

  • 时间复杂度 O(n2)
  • 空间复杂度O(1)

额外注意:0会报错,0是1位数,当前算法会判断0是0位数,就死了,特殊情况单独处理即可

3.3.2 转字符串

Java

public int findNumbers(int[] nums) {int count = 0;int result = 0;for(int i:nums){if(String.valueOf(i).length() % 2 == 0)result++;}return result;}

对于大规模数据,好用!

需要注意负数的处理,取其绝对值再做。

  • 时间复杂度 O(n)
  • 空间复杂度O(1)

3.4 特殊法题解:根据限定条件求

public int findNumbers(int[] nums) {int result = 0;for(int i:nums){if((i >= 10 && i <= 99) || (i >= 1000 && i <= 9999))result++;}return result;}

此处在力扣会报错,100000不对,但是,这与题目不符,应该是测试用例库错误!不用理会不重要。

当给定一些特殊的限定范围,可以使用特殊法,但是不具备参考价值,没有通用性

3.5 方法比较分析 与 数据限定范围重要性

根据每个方法的分析,可以知道数据范围的重要性,范围不同,算法就不同。

本题面向数组内的元组,因此遍历肯定是要的,for或者for each。

别的没啥好说的。

4 收获

4.1 一定要关注限定范围,你处于真实世界!

4.2 尽可能一次提交正确,不要使用提交试错,比赛也不允许

4.2 面向对象的算法设计 & 清零思维

很难的题目都是由小题目构成

我们需要抽丝剥茧,找到我们所面对的那个对象的算法,只关注它,然后再扩大一层,看看需不需要清零操作,类似往外推。

自外而内,自内而外。

4.3 框架思维

框架一:方法结果及其返回

想象我要得到这个结果,我把它存在这里,然后返回,之后,我再看看我该怎么做。

public int findNumbers(int[] nums) {int result = 0;  // 我要得到的结果存在这里return result;  // 返回这个结果}

**要灵活使用!**例如特殊情况,直接返回就可以,不要再赋值了……
框架二:遍历数组元素

for(int i:nums){}
for(int i = 0;i < nums.length();i++){}

框架三:求正数位数
框架四:特殊情况单独列出

4.4 追求逻辑上的简洁,而不是代码上的简洁

5 第二掌 2020.06.11

重新做一遍,新的感悟

  1. 偶数的定义:整数 % 2 == 0;
  2. 求整数为数的循环法,0要单独算
  3. 求字符串长度,使用了两个类方法

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

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

相关文章

Vivado设置指定源文件进行RTL优化

像VS编译器设置启动项一样&#xff0c;Vivado中&#xff0c;也有类似设计&#xff0c;可以看到&#xff0c;当前选中的是ALU&#xff0c;那么进行RTL优化的时候&#xff0c;会优化RTL的结果&#xff0c;而不是别的&#xff0c;如何改成别的&#xff1f; 在某文件上右键单击选择…

【完整流程】用VSCode替换Vivado默认编辑器

本文楼主找了很多资料&#xff0c;选出了最有用的资料&#xff0c;按照教程走&#xff0c;就可以顺利搞定&#xff0c;先给出画面 很酷很方便&#xff0c;同时还有 自动补全检测错误列选自动生成仿真测试文件 等重要功能 Vivado原来的编辑器是这样的…… 关键是&#xff0c…

IEDA中JavaDoc的自动生成、手动生成,以及生成html文档

1 自动生成类的注释 JavaDoc就是java特有的一种注释。 1.1 配置 首先&#xff0c;IDEA点击File-->Settings 然后Editor-->File and Code Templates-->Class 之后在这地方&#xff0c;添加一些代码 /** * ${description} * * <p> * 创建日期&#xff1a;$…

【java】父类与子类的引用赋值关系

理清楚4个目标 父类引用&#xff08;“名”&#xff09;父类对象&#xff08;“实”&#xff09;子类引用子类对象 理清楚几个操作 // 父类 public class parent{}// 子类 public class sun{}父类引用指向父类对象 parent p1 new parent();子类引用指向子类对象 son s1 …

IDEA自动生成 构造方法 get set方法

对于一个类&#xff0c;创建好成员变量后 右键单击&#xff0c;选中Generate 然后 这几个依次是 构造方法getsetget和set 我们可以选中一个&#xff0c;然后选中要生成的变量&#xff0c;点击OK 这样就可以自动生成 构成方法get方法set方法

IDEA快速修改类名和文件名

在你要修改的类名上&#xff0c;选中类名&#xff0c;然后 右键单击选中Refactor选中Rename 也可以使用快捷键 Win用户是Shift F6

java中 静态方法与成员方法何时使用

静态方法 不操作成员变量&#xff0c;可以直接调用 是用来直接对传入的数据进行操作的 成员方法 需要操作对象的成员变量的 区别 静态方法&#xff0c;不能操作成员变量&#xff0c;只是一个操作成员方法&#xff0c;可以操作成员变量&#xff0c;不仅仅是操作&#xff0…

通过编程解决问题的正确思路

1. 先知道我们面对一个怎样的问题 2. 考虑这个问题在现实生活中&#xff0c;我们要用怎样的方式去解决 3. 从现实到计算机&#xff0c;如何用编程的思路解决 4. 实现&#xff0c;编码和测试 5. 迭代 现实问题自然语言解决方案机器语言解决方案编码实现测试迭代

数据库设计的核心原则 外键的设计 提高插入数据速度

大道至简&#xff1a;数据库设计的核心原则 数据库设计&#xff0c;不得不承认&#xff0c;有很多专业化的理论知识&#xff0c;但是对于初学者来说&#xff0c;只需要大道至简的原则就可以了。 能不重复的就不重复&#xff0c;太重复的就拆开&#xff0c;使用指定数据做识别…

MySQL提高插入数据的效率(结合JDBC)

0 解决问题最佳途径&#xff1a;直接找官方 先说明的是&#xff0c;有问题直接去找官方文档&#xff0c;而不应该去百度搜索&#xff0c;您很容易体验到&#xff0c;搜索引擎很难快速找到真正对您有价值的解决方案&#xff0c;而官方文档是最快捷的途径。 本篇也是基于官方文…

【计算机心理学】先设计再实现 在实现中完善设计

先设计再实现 在物理学中&#xff0c;通常都是先理论证明观点&#xff0c;再进行实践&#xff0c;然后&#xff0c;再有世界各地的科学家根据理论进行实验&#xff0c;以证明观点正确。 在计算机软件开发&#xff0c;硬件开发等&#xff0c;都讲求先逻辑抽象设计&#xff0c;…

【FPGA VerilogHDL】第一次尝试:LED灯基础实验

0 实验环境 0.1 软件环境 ISE 14.7win10vivado 2017.4 0.2 硬件设备 ISE适用的FPGA开发板&#xff1a;ALINK AX309 1 需求 能够灵活控制4个LED灯 2 Verilog实现 timescale 1ns / 1ps // // Create Date: 14:18:20 08/08/2020 // Module Name: led // Revision…

使用ISE一键生成bit文件

我们知道&#xff0c;这几个&#xff0c;在第一次做好源文件之后&#xff0c;需要一个个进行右键单击-->run&#xff0c;以发现错误。 但是之后的调试&#xff0c;只要一点点变化&#xff0c;哪怕是注释变化&#xff0c;都需要重新run3次&#xff0c;太麻烦了。 不过经过实…

【FPGA Verilog】实验二:key按键基础实验

只说一下经验和教训 1 必须按照设计流程走 不要因为实验简单&#xff0c;就直接进行综合&#xff0c;比如按照 设计编码RTL优化仿真综合管脚分配&#xff0c;实现下载 一定要按照这个步骤来。 2 必须先查看开发板说明文档 开始出了一个令人困惑的问题&#xff0c;后来发现…

【Java】字符串转换为数字:Integer的parseInt方法

Java官方文档[1]的解释 public static int parseInt​(String s) throws NumberFormatException Parses the string argument as a signed decimal integer. The characters in the string must all be decimal digits, except that the first character may be an ASCII minus…

在win10上使用Vmware安装Mac OS

安装macOS 如何在Windows上VMware上安装macOS Catalina 10.15 做一些提示&#xff1a; 如果您在第一次启动mac的时候&#xff0c;在出现【语言选择】之前&#xff0c;出现了连接蓝牙内容。 您可以将教程中【修改为win10 x64】那一步跳过&#xff0c;请注意&#xff0c;如果您…

JDBC 防御性编程

防御性编程&#xff08;Defensive Programming&#xff09; 什么是Defensive Programming[1]&#xff1f; 原文&#xff1a;Defensive programming is a form of defensive design intended to ensure the continuing function of a piece of software under unforeseen circu…

【Java】异常处理的目的

编程思维&#xff1a;Defensive Programming 我们写好程序&#xff0c;将其打包&#xff0c;然后用户就可以使用和运行&#xff0c;但是&#xff0c;外界的情况是未知的&#xff0c;我们的程序很可能因为某个因素的出现而崩溃&#xff0c;因此&#xff0c;对于我们可以预测到的…

【Coursera】Getting Started with Python:Week One - Reading: Welcome to The Class

原文 & 翻译 Reading: Welcome to The Class Welcome to Getting Started with Python, the first class in our Python for Everybody Specialization. We have built this class specifically for those with no prior programming experience. With a relatively simpl…

【Java】获取目录及其子目录文件的相关事宜

获取目录及其子目录文件的代码 public class Main {public static void main(String[] args) {String path "D:/"; File f new File(path);Main.getFile(f);}public static void getFile(File file){if(file ! null){File[] f file.listFiles();if(f ! null){for…