设为首页 加入收藏

TOP

2.如何选择go语言基础类型——Leetcode习题9(一)
2023-08-26 21:10:13 】 浏览:130
Tags:何选择 Leetcode 习题

本篇前瞻

欢迎来go语言的基础篇,这里会帮你梳理一下go语言的基本类型,注意本篇有参考go圣经,如果你有完整学习的需求可以看一下。另外,go语言的基本类型比较简单,介绍过程就比较粗暴,不过我们需要先从一个例题开始。

Leetcode习题9

先让我们看下这个来自leetcode的例子,这个是一个比较好的例子,里面有一些关于整形的的知识

题目描述

9. 回文数

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

原题解析

注意原题中已经提供了一个go语言的函数

func isPalindrome(x int) bool {
}

为了方便我们编写代码,我们只需要知道这个函数的输入是x,输出是代表是否是回文数(是:true,否:false),return能返回输出。

解题方法:

  1. 负数必然不是回文数。

  2. 对于非负整数,我们循环x除10,通过x%10获得最低位,并且把最低位当作最高位加入到px中,得到了x的反转过来的数px

  3. 判断pxx是否相等就可以了。

代码编写

使用int32来计算px, 将如下代码提交,不行,答案错误,这是因为如果x=2147483647,那么px=7463847412,超出int32的范围了

func isPalindrome(x int) bool {
	if x < 0 {
		return false
	}

	x32 := int32(x)
	px32 := int32(x)
	for x32 != 0 {
		px32 = px32*10 + x32%10
		x32 /= 10
	}
	return px32 == int32(x)
}

那么换成int64代码如下,提交通过了,我们花费了28ms,仅仅击败12%的人,时间上有问题吗?

func isPalindrome(x int) bool {
	if (x < 0) {
		return false
	}
	x64 := int64(x)
	px64 := int64(0)
	for x64 != 0 {
		px64 = px64*10 + x64%10
		x64 /= 10
	}
	return px64 == int64(x)
}

现在尝试去掉int64的强制转化,居然通过了,只花费4ms,击败了97%的人,这不可思议!

func isPalindrome(x int) bool {
	if (x < 0) { 
		return false
	}
	x64 := x   //整形 
	px64 := 0
	for x64 != 0 { 
		px64 = px64*10 + x64%10 
		x64 /= 10
	}
	return px64 == x //布尔型
}

有符号整形

这种整形就是可以表示负整数,0和正整数

数据类型 占用空间(bit) 长度(字节) 取值范围
int8 8 1 -2^7 ~ 2^7-1(-128~127)
int16 16 2 -2^15 ~ 2^15-1(-32768 ~ 32767)
int32 32 4 -2^32 ~ 2^32-1(-2147483648 ~ 2147483647)
int64 64 8 -2^64 ~ 2^64-1(-9223372036854775808 ~ 9223372036854775807)
int 32或64 4或8 同int32或int64

注意:int的占用空间取决于你的操作系统是32位或64位

那么利用这三次提交的结果,并结合有符号整形的知识,我们可以得出:

  1. 变量强制类型转化会耗时
  2. 编程中的变量的取值范围很重要
  3. Leetcode的判题系统是64位的

基本数据类型

从上面的例题中我们能发现数据类型的选择在编程过程中有着决定性的作用,虽然这很基础,但是决定了你的编程结果是否正确,选择合适的类型会使你编写的程序运行速度更快,占用内存更小。

注意:由于复数类型不常用的关系,本章节不会介绍该类型。

整形

这个不是韩国的“绝学”——整形术,整形在编程中可以表示一定范围内的整数

注意:int或uint的占用空间取决于你的操作系统是32位或64位

对于整形我们要关注的是数据类型的长度,数据范围

代码如下:

package main

import (
	"fmt"
	"math"
	"unsafe"
)

func main() {
	fmt.Printf("int8   length: %v range: %v ~ %v\n", unsafe.Sizeof(int8(1)), math.MinInt8, math.MaxInt8)
	fmt.Printf("int16  length: %v range: %v ~ %v\n", unsafe.Sizeof(int16(1)), math.MinInt16, math.MaxInt16)
	fmt.Printf("int32  length: %v range: %v ~ %v\n", unsafe.Sizeof(int32(1)), math.MinInt32, math.MaxInt32)
	fmt.Printf("int64  length: %v range: %v ~ %v\n", unsafe.Sizeof(int64(1)), math.MinInt64, math.MaxInt64)
	fmt.Printf("int    length: %v\n", unsafe.Sizeof(int(1)))

	fmt.Printf("uint8  length: %v range: 0 ~ %v\n", unsafe.Sizeof(uint8(1)), math.MaxUint8)
	fmt.Printf("uint16 length: %v range: 0 ~ %v\n", unsafe.Sizeof(uint16(1)), math.MaxUint16)
	fmt.Printf("uint32 length: %v range: 0 ~ %v\n", unsafe.Sizeof(uint32(1)), math.MaxUint32)
	fmt.Printf("uint64 length: %v range: 0 ~ %v\n", unsafe.Sizeof(uint64(1)), uint64(math.MaxUint64))
	fmt.Printf("uint   length: %v\n", unsafe.Sizeof(uint(1)))
}

输出:

int8   length: 1 range: -128 ~ 127
int16  length: 2 range: -32768 ~ 32767
int32  length: 4 range: -2147483648 ~ 2147483647
int64  length: 8 range: -9223372036854775808 ~ 92233720368
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇protojson简介 下一篇简单对比一下 C 与 Go 两种语言

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目