Bài tập almostIncreasingSequence trên codefight
#Codefight almostIncreasingSequence
Chào các bác, em đang ngồi mò mẫm làm bài tập python trên codefight, và đang dừng ở bài này
almostIncreasingSequence
Mô tả yêu cầu của em nó:
Given a sequence of integers as an array, determine whether it is possible to obtain a strictly increasing sequence by removing no more than one element from the array.
Example
For sequence = [1, 3, 2, 1], the output should be
almostIncreasingSequence(sequence) = false;
There is no one element in this array that can be removed in order to get a strictly increasing sequence.
For sequence = [1, 3, 2], the output should be
almostIncreasingSequence(sequence) = true.
You can remove 3 from the array to get the strictly increasing sequence [1, 2]. Alternately, you can remove 2 to get the strictly increasing sequence [1, 3].
Input/Output
[execution time limit] 4 seconds (py3)
[input] array.integer sequence
Guaranteed constraints:
2 ≤ sequence.length ≤ 105,
-105 ≤ sequence[i] ≤ 105.
[output] boolean
Return true if it is possible to remove one element from the array in order to get a strictly increasing sequence, otherwise return false.
Tạm dịch (em mượn bản dịch của 1 bạn em google đc)
Tạm dịch đề bài: Cho một dãy số bất kì, kiểm tra xem nếu xóa 1 số thuộc dãy số đó thì ta có thu được 1 dãy tăng dần không. Yêu cầu các số trong dãy thu được sau khi xóa phải khác nhau
Đây là code của em:
def almostIncreasingSequence(sequence):
if 2<=len(sequence)<=10**5:
if any(-10**5<=sequence[i]<=10**5 for i in range(0,len(sequence)-1)):
if len(sequence) ==2:
return True
else:
count=0
# list(sequence)
# counta=0
for i in range(0,len(sequence)-1,1):
if sequence.count(sequence[i]) >1:
count=100
for i in range(0,len(sequence)-2,1):
if sequence[i+1]-sequence[i] != 1:
count+=1
print(count)
if count >1:
return False
else:
return True
Thuật toán em k biết sau đâu ko, nhưng chạy test thì toàn báo tạch :((( nhờ các cao nhân cho em ít ánh sáng, em cám ơn
Input:
sequence: [0, -2, 5, 6]
Output:
false
Expected Output:
true
Console Output:
2
Input:
sequence: [1, 2, 5, 3, 5]
Output:
false
Expected Output:
true
Console Output:
102
bài này chỉ cần đếm số cặp (a,b) mà a,b liền kề và a >= b là đủ rồi phải ko nhỉ @_@
1 dòng vậy ko biết đúng ko =)
em cám ơn bác, em suy nghĩ hổng nhiều quá.
fail ở trường hợp đầu vào = [1, 2, 1, 2] bác ơi
Input:
sequence: [1, 2, 1, 2]
Output:
true
Expected Output:
false
Console Output:
Empty
ờm, thấy nó đơn giản quá nên thấy kì kì =)
Theo đề “strictly increasing sequence”, dịch tiếng Việt là “dãy tăng nghiêm ngặt”, thì a[i] < a[i+1], với mọi i từ 1, đến N - 1. N là số phần tử của dãy.
Đúng không nhỉ?
đúng rồi, nghĩa là 1 1 1 2 cũng ra giá trị False.
chưa nghĩ ra cách giải 1 dòng =)
chả hiểu thế nào, e thấy test như này
Input: sequence: [1, 2, 5, 3, 5]
Output: false
Expected Output: true
e thấy dãy đó xóa kiểu gì cũng false, mà bọn codefight bảo phải trả về True mới đúng :)))))
xóa số 5 ở giữa là xong mà…
chắc ko có cách 1 dòng…
xóa số 5 ở giữa --> 1 2 3 5 ?? có phải dãy tăng nghiêm ngặt đâu bác
1 < 2 < 3 < 5 ko phải à @_@
Thuật toán đơn giản: Search từ đầu đến cuối, nếu dãy có 1 lần không tăng duy nhất thì là đúng, còn nếu nhiều hơn thì là sai. Sao code lại dài như thế
edit: Phải thêm dòng kiểm tra xem
sequence[i + 1]
có phải phần tử cuối cùng không, nếu không thì kiểm tra tiếp xemsequence[i + 2]
có lớn hơnsequence[i]
không, nếu có thìDecreasingCount += 1
, không thìDecreasingCount = 2
edit #2: Vẫn sai, thôi dẹp đi -_-
Summary
C#
C#
1 dòng như vầy có được ko
sai với input 1 2 1 2 rồi kìa, cách 1 dòng đầu tiên của mình đó =)
Sai cái giề, đây là đáp án của mình hồi mình còn chơi CF, vừa mới lên copy ra đấy
edit: Ơ đm, tại sao vừa chạy thử lại sai nhỉ, hay là hồi đó mình sửa lại rồi
viết 5 dòng chi cho khổ, 1 dòng
1 >= sum(a >= b for a, b in zip(sequence[:-1], sequence[1:]))
là được rồi, mà nó ra sai =)1 2 1 2 chỉ có 2 1 là giảm, nhưng xóa 2 nó ra 1 1 2 hay xóa 1 nó ra 1 2 2 đều là dãy ko tăng dần (có 1 == 1 và 2 == 2)
Code theo phương pháp trâu bò
C#
Bác nào biết Python port sang cái
Code của mình, đã test qua các test case ở trên.
P/s: Đã thêm điều kiện phần removed_index > 0
E cám ơn bác, E chuyển code của bác sang python.
Qua chạy thử em thấy tạch ở case [1, 2, 3, 4, 3, 6] case này đáng lý vẫn là True, nhưng vẫn k thỏa mãn
removed_index > 0 and sequence[removed_index-1]>=sequence[removed_index+1]: và trả về False :((
Hay e chuyển sang python bị sai
Code đúng chạy được. (em đi mượn)