算法题:所有数组中的数字小于n

1 篇文章 0 订阅

算法描述: 每次从a[i]中取出最大的减去n,其他的n-1个数加上1,一直重复到最大的a[i]<n,执行次数记为k。

输入描述:
第一行一个数n(2<=n<=50) 第二行n个数表示数列a[i](1<=a[i]<=10^18)

输出描述:
一个数表示k

测试用例:

输入:
3
1 0 3

输出:
1

也不知道对不对,望指正!

var n=parseInt(readline())
var list=readline().split(' ')
for(var i=0;i<list.length;i++){
    list[i]=parseInt(list[i])
}
var k=0
var obj
var max=Math.max.apply(obj,list)
while(max>=n){
    var ind=list.indexOf(max)
    var times=Math.floor(max/n)
    list[list.indexOf(max)]=max-n*times
    list.forEach(function(value,index,list){
        if(ind==index){
            return list[index]=value
        }              
        else{
            return list[index]=value+times
        }
    })
    var max=Math.max.apply(obj,list)
    k=k+times
    
}
console.log(k)

总结

  1. 首先数组的长度小于50,但是数组的值很大,关键点在于减少循环的次数,通过var times=Math.floor(max/n)减少循环的次数,可以得到一个很好的提升
  2. 望指正!也希望博友们一起分享些其他的算法思路。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
### 回答1: 思路:对于一个组,如果它满足条件,那么它一定可以被表示成一个前缀乘积和一个后缀异或的形式。因此,我们可以枚举每个位置作为后缀的起始位置,然后用前缀乘积除以后缀异或,判断是否相等即可。 时间复杂度:O(n) 代码如下: ```go func countSubarrays(A []int) int { n := len(A) ans := 0 for i := 0; i < n; i++ { prod := 1 xor := 0 for j := i; j < n; j++ { prod *= A[j] xor ^= A[j] if prod == xor { ans++ } } } return ans } ``` ### 回答2: 可以使用动态规划的方式解决这个问,时间复杂度为O(n)。 具体算法如下: 1. 定义一个变量`count`用于统计满足条件的子组个,初始化为0。 2. 定义一个变量`pre`用于保存前缀异或结果,初始化为0。 3. 定义一个哈希表`mp`用于记录每个异或结果的出现次,默认将0加入到哈希表中,出现次为1。 4. 遍历组A,记当前元素为`num`。 a. 更新前缀异或结果:`pre ^= num`。 b. 如果`pre`在哈希表中已经存在,则将`count`加上`mp[pre]`的值,表示存在`mp[pre]`个子组,满足乘积等于异或。 c. 将`pre`加入到哈希表中,更新出现次:`mp[pre]++`。 5. 返回`count`,即为满足条件的子组个。 完整的Go语言代码如下: ```go package main import "fmt" func main() { A := []int{2, 3, 4, 2} count := numSubarrayProductEqualXor(A) fmt.Println(count) } func numSubarrayProductEqualXor(A []int) int { count := 0 pre := 0 mp := make(map[int]int) mp[0] = 1 for _, num := range A { pre ^= num if freq, ok := mp[pre]; ok { count += freq } mp[pre]++ } return count } ``` 以上代码可以得到满足条件的子组个为2。 ### 回答3: 可以使用哈希表来解决这个问。首先遍历组A,计算前缀异或和prefixXOR,并记录前缀异或和的出现次。 然后对于每个子组,我们可以得到子组的异或和xor,如果这个子组长度为k,则异或和的出现次为prefixXOR出现次减去prefixXOR (A[i-k])出现次。 最后统计所有符合条件的子组的个即可。 以下是使用Go语言实现的代码: ```go func numSubarraysWithProdEqualsXOR(A []int) int { n := len(A) prefixXOR := 0 xorCount := make(map[int]int) xorCount[0] = 1 result := 0 for i := 0; i < n; i++ { prefixXOR ^= A[i] if count, ok := xorCount[prefixXOR]; ok { result += count } xorCount[prefixXOR]++ } return result } ``` 该算法的时间复杂度为O(n),其中n为组A的长度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值