力扣九十三:复原IP地址
复原IP地址
题目描述:
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
有效的 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。
例如:”0.1.2.201” 和 “192.168.1.1” 是 有效的 IP 地址,但是 “0.011.255.245”、”192.168.1.312” 和 “192.168@1.1“ 是 无效的 IP 地址。
示例 1:
输入:s = “25525511135”
输出:[“255.255.11.135”,”255.255.111.35”]
示例 2:
输入:s = “0000”
输出:[“0.0.0.0”]
示例 3:
输入:s = “1111”
输出:[“1.1.1.1”]
示例 4:
输入:s = “010010”
输出:[“0.10.0.10”,”0.100.1.0”]
示例 5:
输入:s = “101023”
输出:[“1.0.10.23”,”1.0.102.3”,”10.1.0.23”,”10.10.2.3”,”101.0.2.3”]
提示:
0 <= s.length <= 3000
s 仅由数字组成
思路:
学到的东西
1、搞清楚了切片和数组的区别,切片要导入的话得用append,没有大小限制
2、s[i]-‘0’出来的结果是byte类型的
3、要重置一个字符串型的变量,var一个新的string变量,然后要它等于新的string变量
4、要返回一个空的字符串切片,return []string{}
5、要用len求数字的长度,要用strconv.Itoa把数字转化成字符串才能求
思路:
第一步先求长度符不符合标准,第二步求有无非法字符,第三步开始正式处理,这道题好像是一串数字,在里面加上3个点,然后判断被三个点隔开的4个数字符不符合标准,把4个数字取出来,然后分别判断是否小于255,然后判断这4个数字的长度和s的长度一不一样,如果不一样说明数字前面有0,就不符合条件
代码:
import "strconv"
var s_len int
func restoreIpAddresses(s string) []string {
var s1 ,s3 string
var s2 []string
var n1,n2,n3,n4,sum_len int
s_len=len(s)
//如果长度不达标
if s_len<4 || s_len>12{
return []string{}
}
//如果出现非法字符
for i:=0;i<s_len;i++{
if s[i]<'0' || s[i]>'9'{
return []string{}
}
}
for i:=0;i<s_len-3&&i<=2;i++{
for j:=i+1;j<s_len-2&&j-i<=3;j++{
for k:=j+1;k<s_len-1&&k-j<=3;k++{
n1,n2,n3,n4,sum_len=stio(s,i,j,k)
if n1<=255&&n2<=255&&n3<=255&&n4<=255&&sum_len==s_len{
for m:=0;m<s_len;m++{
s1=s1+string(s[m])
if m==i||m==j||m==k{
s1=s1+"."
}
}
s2=append(s2,s1)
//重置s1
s1=s3
}
n1,n2,n3=0,0,0
}
}
}
return s2
}
func stio(s string,a int,b int ,c int) (int,int,int,int,int) {
var n1,n2,n3,n4 int
var sum_len int
for i:=0;i<=a;i++{
n1=n1*10+int(s[i]-'0')
}
for i:=a+1;i<=b;i++{
n2=n2*10+int(s[i]-'0')
}
for i:=b+1;i<=c;i++{
n3=n3*10+int(s[i]-'0')
}
for i:=c+1;i<s_len;i++{
n4=n4*10+int(s[i]-'0')
}
sum_len=len(strconv.Itoa(n1))+len(strconv.Itoa(n2))+len(strconv.Itoa(n3))+len(strconv.Itoa(n4))
return n1,n2,n3,n4,sum_len
}
代码效率:
执行用时:0 ms, 在所有 Go 提交中击败了100.00%的用户
内存消耗:2.1 MB, 在所有 Go 提交中击败了56.25%的用户
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!