Ruby基本介绍(一) && Reverse-integer解法

前言:正确的坐姿很重要

坐姿正确,才能避免腰部受伤,想投身久坐的职业,请爱护身体。


内建型态与变数(variable)

内建型态或者称内建类别,也就是程序语言中已经标准化的资料型态,例如数字、字串、阵列、杂凑及符号等,很多语言的内建型态都很类似,也都有可能相同的内建方法,来对这些资料型态,或是资料封装後变成的实体来进行查询或操作等。

变数在这里我会先用数学内的解释方式,是一个用来表示"值"的"记号","Ruby中用变数来将前面提到的那些资料,来实体化"。在Ruby中,变数是非大写开头的英文字母组合,可加数字但第一个字要英文,不可加符号。
: 就是指那些资料。
记号 : 因符号类别,我自己故意称记号。

很多人都说,Ruby是有很多方便语法的语言,是不是最多我不知道,但的确不少,可是要熟悉使用一些语法(黑魔法),必须先了解你的资料型态属於哪一种类别,因为不同的类别是有不同的方法的,当然也有方法不同的类别也会有。
因此学习怎麽查询操作这些类别前,请先学会一个method,就是class。如下图。

https://ithelp.ithome.com.tw/upload/images/20210805/20135887hBOl2QmwiC.png

电脑非常的清楚回答,输入的资料为哪一种类别(有发现都是大写英文吗?),知道正确的类别有哪些方法,才能快速的上手,不然跟我一样常常看到类似

NoMethodError (undefined method ??? for "???":String)

的台词,是会信心大打折的。

接着知道我们要操作的资料是哪种类别後,便可以到https://ruby-doc.org ,查询我们所需要的语法。
这边先以我想分享解题的Reverse-integer中会用到的一些常用方法来举例。


TO系列

语法中如果出现长得像

to_?

,大概就知道是需要转换型态,常用到的有to_i, to_s, to_a及to_h等。
非常的口语化,to Integer或to String,就是变成上面说到的那些类别,下图简单示范

https://ithelp.ithome.com.tw/upload/images/20210805/201358874ae1J5oe1o.png

可以发现数字可以转换成字串,但不可以直接to_a转成阵列。

https://ithelp.ithome.com.tw/upload/images/20210805/20135887vH7FbtqNZE.png

阵列可以转换成字串,但不可以成数字,而要了解Ruby中转型的规定除了多练习外,就是查看https://ruby-doc.org 各个列别中有哪些方法可以用,来快速上手。

加映:加减号
https://ithelp.ithome.com.tw/upload/images/20210805/20135887Mr8t5NdSRv.png

再举例一个方法reverse,字串可用,数字不可直接用。
https://ithelp.ithome.com.tw/upload/images/20210805/20135887qCCHwLLqkb.png

这种在程序语言中,某类别能用,某类别不行的语法是非常多的,只有多练习了。


衍生题

  • 变数与常数的差别?
  • 符号与字串的差别?
    由於网路上非常多答案,我会在下篇文章分享"菜鸟式回答"。

Reverse-integer解法

leetcode上的Easy题型第二题,为什麽我不从第一题解勒?
因为:第一题我就不会了呀,转职工程师梦想从刷leetcode开始,在第一题结束!
单纯因为第二题刚好符合今天介绍的内容。

# 题目:Given a signed 32-bit integer x, return x with its digits reversed. If reversing x causes the value to go outside the signed 32-bit integer range [-2**31, 2**31 - 1], then return 0.

# Assume the environment does not allow you to store 64-bit integers (signed or unsigned).

# Example 1:
# Input: x = 123
# Output: 321

# Example 2:
# Input: x = -123
# Output: -321

# Example 3:
# Input: x = 120
# Output: 21

# Example 4:
# Input: x = 0
# Output: 0

# Constraints:
# -2 ** 31 <= x <= 2 ** 31 - 1

题目很简单,看不懂那串长长的英文,看例子也可以看出,题目希望我们将数字反转,但是正负数,或尾数是零,0,以及结果必须是32bit(就是-2 ** 31 <= x <= 2 ** 31 - 1这范围之内),初学者,不可能一看到题目马上会解,但是这些例子其实常常是答案,告诉你要将题目变成什麽答案,所以可以考虑跟菜鸟我一样从例子下手,满足例子,答案常常就已经跑出来了。
https://ithelp.ithome.com.tw/upload/images/20210805/20135887qe7Vih7udT.png
求出 x.to_s.reverse.to_i 是我们所需一段程序码。

https://ithelp.ithome.com.tw/upload/images/20210805/20135887A11bKETWo3.png
求出 -(x.to_s.reverse.to_i) ,负号的使用,以及()可以省略。

https://ithelp.ithome.com.tw/upload/images/20210805/201358874AG7HshYdA.png
这边也是一个特点,数字字串如果前面有0,转换後会自动去除,所以 x.to_s.reverse.to_i 即可满足
至於零转换还是零,所以也可用同一条程序码解决,或是去考虑0是否就不必检查,那又是另外一个问题

最後,将「-2 ** 31 <= x <= 2 ** 31 - 1」转换成程序码,

x < -2 ** 31 - 1 || x > 2 ** 31 + 1

将这些程序码加入判断(if)後即可求出解答,由於我还没介绍到那边,所以直接先贴自己的解法,如果真的是新手有缘人看不懂,我会之後说明,另外我的解法绝对不是最好解法,每个人每个时期,解题都可能会有不同的解法的,我相信高手们也都是会这样认为,只是菜鸟我解法可能很丑是绝对的。

def reverse(x)
  if x >= 0 
    res = x.to_s.reverse.to_i
  else
    res = -x.to_s.reverse.to_i
  end
  
  if res < -2 ** 31 - 1 || res > 2 ** 31 + 1
    0
  else
    res
  end
end

三元运算式简化先跳过,後提。

题外话

其实我也是个英文苦手者,到现在常常打true还常常打成ture,但请一起克服这点,英文也就是多看多读多用就会的东西(说得很心虚)。
有人会问为何要解题,我会先回答,因为可以快速练习到程序语言中特殊有的语法、惯例及特性。
在初学阶段解题时,常常搞不懂,解题有用处吗?
会有这个疑问其实就是看不懂题目及没有真正实做过专案,程序语言是拿来与电脑沟通後下达指令及查询所需资料的,解题就是为了能查到存放在记忆体中的资料所做的练习(只是其一)。


<<:  在 elementory OS 5.1 上轻松安装呒虾米

>>:  unity 物体按住key后移动和转向

IOS、Python自学心得30天 Day-8 tensorflow.python.keras.optimizer_v2.adam改版问题

前言: 经过这两天的测试,总算知道问题出在哪里,之前训练模型的准确度低,是因为他根本没训练到,查了很...

【PHP Telegram Bot】Day14 - 基础(3):字串处理与正规表示式

在程序里第二个常出现的就是字串处理啦 运算子 连接运算子 说明 用法 . 连接 x . y .= ...

【学习笔记】Git branch

在开发专案时可能会有多人同时commit和push的状况,很容易有conflict,这时候就需要使用...

Digital India With CSC Login

Digital India is a campaign launched by the Govern...

Day 29 - Rancher Fleet Helm + Kustomize 应用程序部署

本文将於赛後同步刊登於笔者部落格 有兴趣学习更多 Kubernetes/DevOps/Linux 相...