数组在内存中是一块连续的内存空间,我们可以直接通过下标进行访问,并进行修改。
在Java中,对于List类型来说,我们可以通过set(idx, element)方法将idx位置的元素进行修改。
数组的移动不能通过一条语句来实现,通常来说需要通过:插入、删除或者多次交换来实现。
数组的插入比较麻烦,我们想要在下标为k的位置插入一个元素时,首先需要将k及以后的元素往后移动一个位置,然后再将元素插入到k的位置处。
在Java中,对于List类型来说,我们可以通过add(idx, element)方法将元素添加到idx下标处。
删除下标为k的元素时,需要将k以后的元素向前移动一个位置。
对于List类型来说,我们可以通过remove(idx)方法删除下标为idx的元素。
给你一个长度为 n的整数数组,每次操作将会使 n - 1 个元素增加 1 。返回让数组所有元素相等的最小操作次数。
这道题有一个很巧妙的思路:由于我们并不关心最终元素相等时的值而只关心操作的次数。所以我们可以将上述问题转化为:每次操作使一个元素减少1,返回让数组中所有元素相等的最小操作数。这样就简单了:我们想要操作数最小,就必须找到能使所有元素相等的最小值,其实这个值就是数组中的最小值。而操作的次数就是:每个数与最小值的差值之和。
class Solution {
public int minMoves(int[] nums) {
int min = Integer.MAX_VALUE;
for(int i = 0; i < nums.length; i++){
min = Math.min(nums[i], min);
}
int ans = 0;
for(int i = 0; i < nums.length; i++){
ans = ans + nums[i] - min;
}
return ans;
}
}
那么正向思考这个问题应该怎么做呢?
注意到:每次操作都使n-1个数加1,也就是所每次操作都会使该数组的sum加上n-1。假设最小操作数为a次,那么此时一定有数学关系式:\(a(n-1) + sum = nx\),其中x为最终数组中的值。
仅有这一个关系式的约束是不够的,我们还要想清楚的一点就是:原数组中最小的那个数需要操作a次才能够变为x ,即:\(min + a = x\) (这个比较难想明白)
根据这两个公式我们就可以求出最终的a了:\(a = sum - n * min\)
class Solution {
public int minMoves(int[] nums) {
int min = Integer.MAX_VALUE;
int sum = 0;
for(int i = 0; i < nums.length; i++){
sum += nums[i];
min = Math.min(nums[i], min);
}
return sum - nums.length * min;
}
}
时间复杂度:O(n)
空间复杂度:O(1)
给你一个长度为 n 的整数数组 nums,请你判断在最多改变 1 个元素的情况下,该数组能否变成一个非递减数列。
从前往后遍历,找到第一个 a > b的情况时,对a 或 b 的值进行修改,然后判断修改后的数组是否为非递减数组即可。关键在于:修改 a 还是 修改 b 呢?
这里其实是有两个选择的:
b;a;一种简单的方法就是:我们两种情况都尝试,看看是否能够得到非递减数组。
class Solution {
public boolean checkPossibility(int[] nums) {
for(int i = 0; i < nums.length - 1; i++){
if(nums[i] > nums[i + 1]){
int n_1 = nums[i];
int n_2 = nums[i + 1];
// 修改a
nums[i] = n_2;
if(checkMethod(nums)) return true;
// 复位a
nums[i] = n_1;
// 修改b
nums[i + 1] = n_1;
if(checkMethod(nums)) return true;
return false;
}
}
return true;
}
boolean checkMethod(int[] nums){
for(int i = 1; i < nums.length; i++){
if(nums[i - 1] > nums[i]) return false;
}
return true;
}
}
时间复杂度:O(n)
空间复杂度:O(1)
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
关键点:保持非零元素的相对顺序。
首先排除首尾双指针的思路,因为要保持非零元素的相对顺序,所以不能够使用首尾双指针来做。
首尾双指针是指:左指针找第一个0元素,右指针找第一个非0元素,然后交换两个元素。有点像归并排序。
由于不复制数组,所以大概率还是使用双指针来操作。分析一下,假设我们知道left左侧都是非零元素,然后在left右侧找到了一个非零元素,此时只需要将该元素放在left下标下即可。
基于此思路,我们用left来标识已经处理元素的右边界,然后通过右指针去寻找下一个非0元素,找到后放置在left位置并将left指针右移。
class Solution {
public void moveZeroes(int[] nums) {
int left = 0;
int right = 0;
while(right < nums.length){
if(nums[right] != 0){
nums[left] = nums[right];
left ++;
}
right ++;
}
while(left < nums.length){
nums[left] = 0;
left ++;
}
}
}
时间复杂度:O(n)
空间复杂度:O(1)
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby数组,我们在StackOverflow上找到一
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作
我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>
当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?
我正在尝试按0-9和a-z的顺序创建数字和字母列表。我有一组值value_array=['0','1','2','3','4','5','6','7','8','9','a','b','光盘','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','','u','v','w','x','y','z']和一个组合列表的数组,按顺序,这些数字可以产生x个字符,比方说三个list_array=[]和一个当前字母和数字组合的数组(在将它插入列表数组之前我会把它变成一个字符串,]current_combo['0','0','0']