给定一系列N整数,其中1 <= N <= 500数字介于两者之间1 and 50.在一个步骤中,任何两个相邻的相等数字x x可以用一个替换x + 1.这些步骤可达到的最大数量是多少.
例如,如果给定2 3 1 1 2 2则最大可能是4:
2 3 1 1 2 2 ---> 2 3 2 2 2 ---> 2 3 3 2 ---> 2 4 2.
很明显,我应该尝试做得比序列中可用的最大数量更好.但我无法弄清楚一个好的算法.
给出了一个加权的无方向图,检查在顶点1和n之间是否存在权重k的路径。
看起来像一个NP问题,但要求我在2秒内检查它,K为<= 10 ^ 18。我们可以根据需要使用每条道路多次。将不胜感激。
N和M非常小(<= 50),因此我考虑将dp用于权重最大为k的路径。N,M,K是整数,边缘的权重<10 ^ 4。该图可能未连接。很遗憾,此问题来自代码部队培训,该语句不是英语,因此在附加该语句时不会有任何用处。
有一个国家有n个城市,城市的编号从1到n,所有道路均通向。每条道路连接两个城市。
沃克先生真的很喜欢散步。沿任何方向向任何方向行驶都需要w(i)分钟。沃克先生不住在城市,一到达一个城市,他便立即去另一个城市。
沃克先生从排名第一的城市开始,希望在整整K分钟内到达第n个城市。您需要检查是否可行。
输入-第一行包含两个整数n,m(1 ??? n,?m ??? 50)。接下来的m行描述道路a(i)-起点,b(i)-终点,d(i)-沿着这条路行驶所需的时间(1 ??? ai,?bi ??? n; 1 ??? di ??? 10 ^ 4)。
最后一行包含数字k-沃克先生希望其路径采用的时间(1 ??? t ??? 10 ^ 18)。
如果可以的话,打印是可能的;如果沃克先生不能在准确的k分钟内到达第n个城市,则不可能。
找到 x1, x2, ..., xn:
x_1^p_1 + x_2^p_2 + ... + x_(n-1)^p_(n-1) ? x_n^p_n (mod 1e9+7)
输入:
第 1 行:正整数 n > 1
第 2 行:n 个不同的素数 p1, p2, ..., pn (p1 * p2 * ... * pn <= 1e18)
输出:
一组 n 个正整数 (x_1, x_2,..., xn) (1 <= x_i < 1e9+7)
例如,
输入 1:
2
3 5
输出 1:
1 1
(因为 1^3 ? 1^5 (mod 10^9 + 7))
输入 2:
3
2 3 7
输出 2:
8 4 …
我提出了解决另一个问题的想法,并希望能够帮助确定函数的复杂性,因为我对此并不太了解.我是否正确地猜测每个块的"未分类" ?然后sortBy函数的复杂性是什么,它将一个块的最后一个与另一个块的头部进行比较?我的猜测是,该函数只会比较对,而不需要根据总列表找到一个块的顺序.另外,由于整体功能的懒惰优化,Haskell会提供不同的复杂性吗?提前致谢!O (n * log 2)
import Data.List.Split (chunksOf)
import Data.List (sortBy)
rearrange :: [Int] -> [Int]
rearrange = concat
. sortBy (\a b -> compare (last a) (head b))
. map (sortBy (\a b -> compare b a))
. chunksOf 2
Run Code Online (Sandbox Code Playgroud) 我试图编写一个函数来读取包含列表的列表,并返回相同的列表结构但没有元素.
def remove_from_list(l):
for e in l:
if isinstance(e, list):
remove_from_list(e)
else:
l.remove(e)
return l
Run Code Online (Sandbox Code Playgroud)
所以对于这样的输入:
[1, 2, [], [3,[4]], 5]
Run Code Online (Sandbox Code Playgroud)
我应该得到这样的东西:
[[], [[]]]
Run Code Online (Sandbox Code Playgroud)
我尝试了这些输入:
[1, 2, [], [3,[4]], 5]
[1, 2, [], [2,[3]], 2]
Run Code Online (Sandbox Code Playgroud)
得到这些输出:
[2, [], [[4]]]
[[], [[3]], 2]
Run Code Online (Sandbox Code Playgroud)
这是非常令人困惑的,因为两个列表的结构是相同的; 只有元素不同.因此,我不仅会犯错误,而且会得到另一个错误.帮助我的错误的功能和解释将非常感激.
给你一个包含N整数的数组,你必须回答K查询。每个查询都包含一个整数X,它是数组的(从 1 开始的索引)元素的索引。
为每个查询计算以下内容:
The number of segments containing the index X as the leftmost or the
rightmost element and the number at the index `X` is `>=` each element
of that segment.
Run Code Online (Sandbox Code Playgroud)
段形成示例:
您有 array {1, 2, 3}。可能的线段3是[2,3]和[1,2,3]和[3]。
2 的可能部分是[2],[1,2]
我通过暴力得到了解决方案。最坏情况的时间复杂度是O(n * k)
Input: Array[] = {4,2,1,3}, Queries[] = {1,4}
Output:
4
3
Explanation:
For first query 1 all possible …Run Code Online (Sandbox Code Playgroud) 第二次更新:
我终于按照zurgl的建议写了一些递归遍历和分组的东西。感谢所有试图提供帮助的人!
第一次更新:
我希望可以是一个排序功能,但不确定,是为了优化接下来的分组(最小化组数)。分组收集水平或垂直相邻的元组:
f xs =
foldr (\a@(y,x) ((b@(y',x'):xs):bs) -> if (y == y' && abs (x-x') == 1) ||
(x == x' && abs (y-y') == 1)
then (a:b:xs):bs
else [a]:(b:xs):bs)
[[last xs]] (init xs)
Run Code Online (Sandbox Code Playgroud)
第二个例子的输出,在“排序”之后:
*Main> f [(0,1),(1,1),(2,1),(2,2),(2,3),(1,3),(0,3),(4,1),(4,2)]
[[(0,1),(1,1),(2,1),(2,2),(2,3),(1,3),(0,3)],[(4,1),(4,2)]]
Run Code Online (Sandbox Code Playgroud)
——更新结束——
我在构思排序功能时遇到了麻烦,我希望有人可能知道如何实现它,或者说是否可能需要比自定义排序更多的功能。我试过玩弄 sortBy,但似乎没有取得太大进展。
我如何从中获得:
[(0,1),(0,3),(1,1),(1,3),(2,0),(2,1),(2,3),(4,1),(4,2)]
Run Code Online (Sandbox Code Playgroud)
对此:
[(0,1),(1,1),(2,0),(2,1),(0,3),(1,3),(2,3),(4,1),(4,2)]
Run Code Online (Sandbox Code Playgroud)
之间的0或1的不同既YY“和XX”应该是主。那有意义吗?
第二个例子:
[(0,1),(0,3),(1,1),(1,3),(2,1),(2,2),(2,3),(4,1),(4,2)]
=>
[(0,1),(1,1),(2,1),(2,2),(2,3),(1,3),(0,3),(4,1),(4,2)]
Run Code Online (Sandbox Code Playgroud) 今天早上我没能通过这次面试。
给定一个整数数组,执行一些k操作,每个操作包括删除一个元素并将其除以 2并计算 ceil然后用新元素替换该元素。
最后,最小化最终数组的结果
例子:
nums=[10,20,7]
k=4
Run Code Online (Sandbox Code Playgroud)
最终数组将是:
[5,5,4]
Run Code Online (Sandbox Code Playgroud)
总和结果:
5+5+4=14
Run Code Online (Sandbox Code Playgroud)
设想 :
初始数组: [10,20,7]
选择7:[10,20,4]
选择10:[5,20,4]
选择20:[5,10,4]
选择10:[5,5,4]
结果:
5+5+4 = 14
Run Code Online (Sandbox Code Playgroud)
我的代码(未完成):
function minSum(num, k) {
return num.map(value => Math.ceil(value / 2)).reduce((value, acc) => acc + value, 0)
}
console.log(minSum([10, 20, 7]))
Run Code Online (Sandbox Code Playgroud)
什么让我困惑:
• 我们如何根据操作次数挑选元素?
编辑 :
因为我收到了 2 个关闭请求,让我澄清一下:
假设我们从索引0到最后一个索引选择元素,我的代码中遗漏了什么来满足k操作?
给定任何自然数数组,例如: [2, 1, 2, 3] 查找数组是否可以转换为 Max 数组(打印 - “YES”),否则(打印 - “NO”)
使其成为最大数组 - 将数组的每个元素转换为等于其最大元素。在上面的例子中它将是 [3, 3, 3, 3] 但遵循这些规则 -
示例输入: [2,1,2,3]
预期输出: “是”
解释:
步骤 1:将第一个和第二个元素增加 1 -
[3,2,2,3]
步骤 2:将第二个和第三个元素增加 1 -
[3,3,3,3]
任何人都可以指出解决方案 - 任何链接、类似的问题、模式或解决方案吗?谢谢
编辑:
我尝试过这种方法来解决它 -
但不能完全得到正确的结果。
给定两个长度为 N 的整数数组 A 和 B。您必须找到两个求和的值:
\nZ=\xce\xa3 \xce\xa3 max(Ai+Bj, Bi+Aj)
\n这是我的暴力算法
\n请告诉我一个更有效的算法。
\n尝试使用简单的哈希表算法,似乎对我使用Data.HashMap.我希望更好地理解如何实现一个可变的哈希表(这将是Data.HashTable.IO?),以便提高性能.我完全迷失了...试图修改这里的例子,但是找不到我通过我获得的IO类型的方式(双关语)...提前感谢任何类型的漫游或参考一个.
例如,如何使用可变哈希表实现这个简单的练习?
import qualified Data.HashMap as HM (toList,lookup,insert,empty)
f list = g list HM.empty where
g [] h = HM.toList h
g (x:xs) h = case HM.lookup (x-1) h of
Just _ -> g xs (HM.insert x (x + 1) h)
Nothing -> g xs (HM.insert x x h)
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个函数,该函数接受两个字符串参数,并检查第二个参数是否是第一个字符串的旋转版本。
所以结果如下:
checkRotationStrings('waterbottle', 'lewaterbott'); // true
checkRotationStrings('waterbottle', 'bottlewater'); // true
checkRotationStrings('waterbottle', 'erbottlewat'); // true
checkRotationStrings('waterbottle', 'lewaterbottx'); // false
我编写了以下代码,但有一些边缘情况我似乎无法弄清楚:
function checkRotationStrings(string, rotatedString) {
let result;
let rotationCheck
let stringArr = string.split('');
let rotatedStringArr = rotatedString.split('')
for (let i = 0; i < string.length - 1; i++) {
if (rotatedString[0] === stringArr[i]) {
result = stringArr.slice(i);
rotationCheck = stringArr.slice(0, i).concat(result).join('');
}
}
console.log(rotationCheck)
if (rotationCheck === string){
return true;
} else {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激。
由于我不熟悉C,我在C中尝试了第二个矩阵转置示例,简单地转换为JavaScript(下面的代码).它冻结了浏览器.
有人可以帮我理解可能导致问题的原因吗?C程序在ideone中运行良好.
正如Nirk所指出的那样,C程序中的除法是整数而不是浮点,因此循环不会在没有使用的情况下终止Math.floor.
C代码:
#include <stdio.h>
void transpose(double *m, int w, int h)
{
int start, next, i;
double tmp;
for (start = 0; start <= w * h - 1; start++) {
next = start;
i = 0;
do { i++;
next = (next % h) * w + next / h;
} while (next > start);
if (next < start || i == 1) continue;
tmp = m[next = start];
do {
i = …Run Code Online (Sandbox Code Playgroud)