首页 > 其他分享 >2024-07-31:用go语言,给定两个正整数数组arr1和arr2,我们要找到属于arr1的整数x和属于arr2的整数y组成的所有数对(x, y)中,具有最长公共前缀的长度。 公共前缀是指两个数的

2024-07-31:用go语言,给定两个正整数数组arr1和arr2,我们要找到属于arr1的整数x和属于arr2的整数y组成的所有数对(x, y)中,具有最长公共前缀的长度。 公共前缀是指两个数的

时间:2024-07-31 16:51:37浏览次数:15  
标签:10 前缀 arr2 arr1 公共 mx

2024-07-31:用go语言,给定两个正整数数组arr1和arr2,我们要找到属于arr1的整数x和属于arr2的整数y组成的所有数对(x, y)中,具有最长公共前缀的长度。

公共前缀是指两个数的最左边的一位或多位数字相同的部分。例如,对于整数5655359和56554来说,它们的公共前缀是565,而对于1223和43456来说,它们没有公共前缀。

我们需要找出所有数对(x, y)中具有最长公共前缀的长度是多少,如果没有公共前缀则返回0。

输入:arr1 = [1,10,100], arr2 = [1000]

输出:3

解释:存在 3 个数对 (arr1[i], arr2[j]) :

(1, 1000) 的最长公共前缀是 1 。(10, 1000) 的最长公共前缀是 10 。(100, 1000) 的最长公共前缀是 100 。

最长的公共前缀是 100 ,长度为 3 。

答案2024-07-31:

chatgpt

题目来自leetcode3043。

大体步骤如下:

要解决给定问题,主要分为以下大体步骤:

  1. 初始化一个集合:创建一个映射(集合)has,用于存储arr1中所有整数的前缀。这个集合将用于后续查找整数是否在arr1中的某个前缀。

  2. 提取前缀:遍历arr1中的每个整数,对于每个整数,计算其每个可能的前缀(即数字逐位除以10,直到数字为0),并将每个前缀存入has集合中。这将使得has含有arr1中所有数字的所有前缀。

  3. 初始化一个最大值:设置一个变量mx,用于记录在arr2中找到的最大公共前缀。

  4. 查找公共前缀:遍历arr2中的每个整数,对于每个整数,计算其每个可能的前缀(同样逐位除以10),并在集合has中检查该前缀是否存在。如果存在,则更新mx为当前整数的前缀值,与当前存储的mx进行比较,保留较大的值。

  5. 计算结果:检查mx的值,如果mx为0,表示没有找到公共前缀,返回0。若mx不为0,计算其对应的长度,即将mx转为字符串并取其长度,然后返回这个长度作为结果。

  6. 输出结果:通过主函数调用longestCommonPrefix函数,传递两个整数数组,然后打印返回的最长公共前缀的长度。

时间复杂度:

  • 遍历数组arr1arr2的时间复杂度是O(n * k),其中n是arr2的长度,k是数字的位数(前缀寻找的迭代次数)。但是由于数字的位数是有限的,我们可以认为k是一个常数。因此主要复杂度由遍历造成,即O(n)。

额外空间复杂度:

  • 使用集合has存储前缀,每个整数的前缀数量最多为其位数,因此在最坏情况下,空间复杂度是O(m * k),其中m是arr1的长度,k是数字的位数(符合前缀数量)。但是由于k是常数,所以可以简化为O(m)。总体来说,这个算法在空间上的额外消耗是O(m)。

Go完整代码如下:

package main

import (
	"fmt"
	"strconv"
)

func longestCommonPrefix(arr1, arr2 []int) int {
	has := map[int]bool{}
	for _, v := range arr1 {
		for ; v > 0; v /= 10 {
			has[v] = true
		}
	}

	mx := 0
	for _, v := range arr2 {
		for ; v > 0 && !has[v]; v /= 10 {
		}
		mx = max(mx, v)
	}
	if mx == 0 {
		return 0
	}
	return len(strconv.Itoa(mx))
}

func main() {
	arr1 := []int{1, 10, 100}
	arr2 := []int{1000}
	fmt.Println(longestCommonPrefix(arr1, arr2))
}

在这里插入图片描述

Python完整代码如下:

# -*-coding:utf-8-*-

def longest_common_prefix(arr1, arr2):
    has = set()
    
    # 将 arr1 中的所有数字的每个前缀加入集合
    for v in arr1:
        while v > 0:
            has.add(v)
            v //= 10
    
    mx = 0
    
    # 在 arr2 中找到最大的与 arr1 前缀相同的数字
    for v in arr2:
        while v > 0 and v not in has:
            v //= 10
        mx = max(mx, v)
    
    if mx == 0:
        return 0
    
    return len(str(mx))

if __name__ == "__main__":
    arr1 = [1, 10, 100]
    arr2 = [1000]
    print(longest_common_prefix(arr1, arr2))

在这里插入图片描述

标签:10,前缀,arr2,arr1,公共,mx
From: https://www.cnblogs.com/moonfdd/p/18334982

相关文章

  • 洛谷题单指南-前缀和差分与离散化-P1083 [NOIP2012 提高组] 借教室
    原题链接:https://www.luogu.com.cn/problem/P1083题意解读:已知第i天有r[i]个教室可以供租借,有m个租借教室的订单,第i订单需要在第s[i]~t[i]天区间内租借d[i]个教室,计算是否全部订单都能满足,如果不满足要输出从第几个订单开始不满足。解题思路:1、朴素做法枚举1~m个订单,通过差分......
  • 洛谷题单指南-前缀和差分与离散化-P3406 海底高铁
    原题链接:https://www.luogu.com.cn/problem/P3406题意解读:1-n个城市共了n段路,第i段路不买卡票价a[i],买卡票价b[i](卡本身花费c[i]),给定一个路程顺序,计算最少的通行费用。解题思路:根据路程,计算每段路各走了多少次,然后对于每段路,计算买卡和不买卡两种花费,取较小的累加即可。如何......
  • 三种语言实现二维前缀和(C++/Python/Java)
    题目输入一个n行m列的整数矩阵,再输入q个询问,每个询问包含四个整数x1,y1,x2,y2表示一个子矩阵的左上角坐标和右下角坐标。对于每个询问输出子矩阵中所有数的和。输入格式第一行包含三个整数n,m,q接下来n行,每行包含m个整数,表示整数矩阵。接下来q行,每行包含四个整数......
  • 三种语言实现前缀和(C++/Python/Java)
    题目输入一个长度为n的整数序列。接下来再输入m个询问,每个询问输入一对l,r对于每个询问,输出原序列中从第l个数到第r个数的和。输入格式第一行包含两个整数n和m。第二行包含n个整数,表示整数数列。接下来m行,每行包含两个整数l和r,表示一个询问的区间范围。......
  • 高维前缀和
    二维前缀和是总所周知的,它长这样:\[f[i][j]=f[i-1][j]+f[i][j-1]-f[i-1][j-1]\]这实际上是容斥原理。但我们还可以这样求\(f\)的前缀和:for(inti=1;i<=n;i++)for(intj=1;j<=n;j++)f[i][j]+=f[i][j-1];for(inti=1;i<=n;i++)......
  • 洛谷题单指南-前缀和差分与离散化-P3017 [USACO11MAR] Brownie Slicing G
    原题链接:https://www.luogu.com.cn/problem/P3017题意解读:将一个r*c的矩阵,横向切成a条,每一条纵向切除b块,计算每一块子矩阵之和的最小值最大是多少。解题思路:要计算最小值中最大的,直觉上可以采用二分,下面来分析单调性:给定一个子矩阵块之和的值,值越小可以划分的条数、块数就越多......
  • 洛谷题单指南-前缀和差分与离散化-P2004 领地选择
    原题链接:https://www.luogu.com.cn/problem/P2004题意解读:在一个n*m的矩阵中,找到边长为c的正方形,使得正方形范围内的数之和最大,输出正方形的左上角坐标。解题思路:二维前缀和的简单应用第一步:计算二维前缀和第二步:枚举边长为c的正方形左上角,计算正方形区域的数之和,更新答案第......
  • 洛谷题单指南-前缀和差分与离散化-P1884 [USACO12FEB] Overplanting S
    原题链接:https://www.luogu.com.cn/problem/P1884题意解读:给定n个矩形的平面直角坐标系下左上角、右下角的坐标,计算这n个矩形能覆盖的的格子数。解题思路:直观上来看,此题是一个差分应用,针对二维差分数组,将n个矩形区域内每个格子的值加1,然后统计有多少个不为0的格子即可。但是!坐......
  • 将 int[] arr1 ={10,20,30}; 拷贝到 arr2数组,要求数据空间是独立的。
    1publicclassshuzu06{2//编写一个main方法3publicstaticvoidmain(String[]args){45//将int[]arr1={10,20,30};拷贝到arr2数组,6//要求数据空间是独立的。78int[]arr1={10,20,30};910//创建一......
  • 洛谷题单指南-前缀和差分与离散化-P1496 火烧赤壁
    原题链接:https://www.luogu.com.cn/problem/P1496题意解读:给定n个区间[a,b),计算所有区间覆盖的总长度。解题思路:方法1、离散化先思考一种比较直观的思路:既然要计算多个区间覆盖的总长度,可以枚举每一个区间[a,b),通过一个桶数组来标记区间中所有的点f[x]=1,最终统计所有为1的......