작업
정수 배열이 주어지면 다음과 같습니다.
[-1,476,578,27,0,1,-1,1,2]
그리고 그 배열의 인덱스 (이 예제는 0 기반 인덱싱 을 사용하지만 1 기반 인덱싱 도 사용할 수 있습니다 ) :
index = 5
v
[-1,476,578,27,0,1,-1,1,2]
그런 다음 해당 인덱스의 요소보다 가장 가까운 숫자를 반환하십시오 . 이 예에서 1보다 큰 가장 가까운 숫자는 27입니다 (2 개의 인덱스에서).
index = 5
v
[-1,476,578,27,0,1,-1,1,2]
^
Nearest greater number
Output = 27
가정
- 가장 가까운 것은 포장을 포함하지 않습니다.
- 프로그램에는 길이가 1 인 배열이 제공되지 않습니다 (예 🙂
[55]
. - 주어진 요소보다 항상 숫자가 더 크다고 가정해야 합니다.
- 같은 거리에있는 요소보다 2 개의 숫자가 더 큰 경우 둘 중 하나를 반환 할 수 있습니다 .
I / O 쌍
Input:
Index = 45
Array = [69, 43, 89, 93, 62, 25, 4, 11, 115, 87, 174, 60, 84, 58, 28, 67, 71, 157, 47, 8, 33, 192, 187, 87, 175, 32, 135, 25, 137, 92, 183, 151, 147, 7, 133, 7, 41, 12, 96, 147, 9, 134, 197, 3, 107, 164, 90, 199, 21, 71, 77, 62, 190, 122, 33, 127, 185, 58, 92, 106, 26, 24, 56, 79, 71, 24, 24, 114, 17, 84, 121, 188, 6, 177, 114, 159, 159, 102, 50, 136, 47, 32, 1, 199, 74, 141, 125, 23, 118, 9, 12, 100, 94, 166, 12, 9, 179, 147, 149, 178, 90, 71, 141, 49, 74, 100, 199, 160, 120, 14, 195, 112, 176, 164, 68, 88, 108, 72, 124, 173, 155, 146, 193, 30, 2, 186, 102, 45, 147, 99, 178, 84, 83, 93, 153, 11, 171, 186, 157, 32, 90, 57, 181, 5, 157, 106, 20, 5, 194, 130, 100, 97, 3, 87, 116, 57, 125, 157, 190, 83, 148, 90, 44, 156, 167, 131, 100, 58, 139, 183, 53, 91, 151, 65, 121, 61, 40, 80, 40, 68, 73, 20, 135, 197, 124, 190, 108, 66, 21, 27, 147, 118, 192, 29, 193, 27, 155, 93, 33, 129]
Output = 199
Input:
Index = 2
Array = [4,-2,1,-3,5]
Output = 4 OR 5
Input:
Index = 0
Array = [2124, -173, -155, 146, 193, -30, 2, 186, 102, 4545]
Output = 4545
Input:
Index = 0
Array = [1,0,2,3]
Output = 2
Input:
Index = 2
Array = [3,-1,-3,-2,5]
Output = -1 OR -2
답변
MATL , 10 바이트
yt&y)>fYk)
1 기반 인덱싱을 사용합니다. 온라인으로 사용해보십시오!
설명
입력을 고려 [4,-2,1,-3,5]
, 3
예를 들어.
y % Take two inputs implicitly. Duplicate 2nd-top element in the stack
% STACK: [4,-2,1,-3,5], 3, [4,-2,1,-3,5]
t % Duplicate top of the stack
% STACK: [4,-2,1,-3,5], 3, [4,-2,1,-3,5], [4,-2,1,-3,5]
&y % Duplicate 3rd-top element in the stack
% STACK: [4,-2,1,-3,5], 3, [4,-2,1,-3,5], [4,-2,1,-3,5], 3
) % Index: select elements from first input as indicated by second input
% STACK: [4,-2,1,-3,5], 3, [4,-2,1,-3,5], 1
> % Greater than, element-wise
% STACK: [4,-2,1,-3,5], 3, [1,0,0,0,1]
f % Find: gives indices of non-zero entries
% STACK: [4,-2,1,-3,5], 3, [1,5]
Yk % Closest element: gives closest element of each entry in second input
% ([1,5]) to each entry in the first input (3). In case of a tie it
% gives the left-most one
% STACK: [4,-2,1,-3,5], 1
) % Index: select elements from first input as indicated by second input
% STACK: 4
% Implicitly display
답변
답변
답변
자바 스크립트 (ES6), 57 55 바이트
카레 구문에서 배열 a
과 인덱스 i
를 가져옵니다 (a)(i)
.
a=>g=(i,p)=>(x=a[i-p])>a[i]||(x=a[i+p])>a[i]?x:g(i,-~p)
테스트 사례
let f =
a=>g=(i,p)=>(x=a[i-p])>a[i]||(x=a[i+p])>a[i]?x:g(i,-~p)
console.log(f([-1, 476, 578, 27, 0, 1, -1, 1, 2])(5))
console.log(f([69, 43, 89, 93, 62, 25, 4, 11, 115, 87, 174, 60, 84, 58, 28, 67, 71, 157, 47, 8, 33, 192, 187, 87, 175, 32, 135, 25, 137, 92, 183, 151, 147, 7, 133, 7, 41, 12, 96, 147, 9, 134, 197, 3, 107, 164, 90, 199, 21, 71, 77, 62, 190, 122, 33, 127, 185, 58, 92, 106, 26, 24, 56, 79, 71, 24, 24, 114, 17, 84, 121, 188, 6, 177, 114, 159, 159, 102, 50, 136, 47, 32, 1, 199, 74, 141, 125, 23, 118, 9, 12, 100, 94, 166, 12, 9, 179, 147, 149, 178, 90, 71, 141, 49, 74, 100, 199, 160, 120, 14, 195, 112, 176, 164, 68, 88, 108, 72, 124, 173, 155, 146, 193, 30, 2, 186, 102, 45, 147, 99, 178, 84, 83, 93, 153, 11, 171, 186, 157, 32, 90, 57, 181, 5, 157, 106, 20, 5, 194, 130, 100, 97, 3, 87, 116, 57, 125, 157, 190, 83, 148, 90, 44, 156, 167, 131, 100, 58, 139, 183, 53, 91, 151, 65, 121, 61, 40, 80, 40, 68, 73, 20, 135, 197, 124, 190, 108, 66, 21, 27, 147, 118, 192, 29, 193, 27, 155, 93, 33, 129])(45))
console.log(f([4, -2, 1, -3, 5])(2))
console.log(f([2124, -173, -155, 146, 193, -30, 2, 186, 102, 4545])(0))
답변
PHP, 106 바이트
<?for($y=($a=$_GET[0])[$x=$_GET[1]];$y>=$a[$x-++$i]&&$y>=$a[$x+$i];);echo$y<$a[$x+$i]?$a[$x+$i]:$a[$x-$i];
답변
하스켈 , 48 바이트
i%l=minimum[[j*j,x]|(j,x)<-zip[-i..]l,x>l!!i]!!1
온라인으로 사용해보십시오! Ørjan Johansen의 테스트 프레임 워크.
답변
x86-64 어셈블리, 40 바이트
Johan du Toit 및 2501 의 C 솔루션 을 분석하여 영감을 얻은 다음은 x86-64 플랫폼 용 MASM과 조합 할 수있는 기능입니다.
매개 변수를 전달 하는 Microsoft x64 호출 규칙 을 따르므로 배열의 전체 길이가 전달되고 ECX
관심있는 위치가 전달되며 EDX
정수 배열에 대한 포인터가 전달됩니다 R8
(64 비트 플랫폼이므로 64 비트 포인터).
에 결과 ( “가장 큰 숫자”)를 반환합니다 EAX
.
FindNearestGreater PROC
8B F2 \ mov esi, edx ; move pos parameter to preferred register
8B D9 | mov ebx, ecx ; make copy of count (ecx == i; ebx == count)
| MainLoop:
8B C6 | mov eax, esi ; temp = pos
2B C1 | sub eax, ecx ; temp -= i
99 | cdq
33 C2 | xor eax, edx
2B C2 | sub eax, edx ; temp = AbsValue(temp)
|
41 8B 14 B0 | mov edx, DWORD PTR [r8+rsi*4]
41 39 14 88 | cmp DWORD PTR [r8+rcx*4], edx
7E 04 | jle KeepGoing ; jump if (pValues[i] <= pValues[pos])
3B D8 | cmp ebx, eax
77 02 | ja Next ; jump if (count > temp)
| KeepGoing:
8B C3 | mov eax, ebx ; temp = count
| Next:
8B D8 | mov ebx, eax ; count = temp
E2 E3 | loop MainLoop ; equivalent to dec ecx + jnz, but smaller (and slower)
|
| ; Return pValues[temp + pos]
03 C6 | add eax, esi
41 8B 04 80 | mov eax, DWORD PTR [r8+rax*4]
C3 / ret
FindNearestGreater ENDP
C 코드에서 호출하려면 프로토 타입은 다음과 같습니다.
extern int FindNearestGreater(unsigned int count,
unsigned int pos,
const int *pValues);