#P1419. 第2题-小红的区间
-
1000ms
Tried: 152
Accepted: 31
Difficulty: 4
所属公司 :
科大讯飞
时间 :2023年7月22日
-
算法标签>双指针
第2题-小红的区间
思路:双指针
首先我们可以定义两个指针l和r分别找到数组a,b中第一个和最后一个不相同数字的位置
然后我们可以用一个循环来检查l和r之间的数字是否相同,不相同,则直接返回0
如果所有的字符都相同,那么我们就计算答案。我们使用一个循环来计算a和b在l和r之外的相同字符的数量。然后,我们将答案加上+1
时间复杂度
O(n)
c++代码
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> a(n), b(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
for (int i = 0; i < n; i++) {
cin >> b[i];
}
int l = 0, r = 0;
for (int i = 0; i < n; i++) {
if (a[i] != b[i]) {
l = i;
break;
}
}
for (int i = n - 1; i >= 0; i--) {
if (a[i] != b[i]) {
r = i;
break;
}
}
int left = l, right = r;
bool flag = true;
while (left <= r) {
if (a[left] != b[right]) {
cout << 0 << endl;
flag = false;
break;
} else {
left++;
right--;
}
}
if (flag) {
int ans = 1;
l--;
r++;
while (l >= 0 && r < n) {
if (a[l] == a[r]) {
ans++;
l--;
r++;
} else {
break;
}
}
cout << ans << endl;
}
return 0;
}
python代码
n = int(input())
a = list(map(int, input().split()))
b = list(map(int, input().split()))
l = r = 0
for i in range(n):
if a[i] != b[i]:
l = i
break
for i in range(n-1, -1, -1):
if a[i] != b[i]:
r = i
break
left, right = l, r
flag = True
while left <= r:
if a[left] != b[right]:
print(0)
flag = False
break
else:
left += 1
right -= 1
if flag:
ans = 1
l -= 1
r += 1
while l >= 0 and r < n:
if a[l] == a[r]:
ans += 1
l -= 1
r += 1
else:
break
print(ans)
Java代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] a = new int[n];
int[] b = new int[n];
for (int i = 0; i < n; i++) {
a[i] = scanner.nextInt();
}
for (int i = 0; i < n; i++) {
b[i] = scanner.nextInt();
}
scanner.close();
int l = 0, r = 0;
for (int i = 0; i < n; i++) {
if (a[i] != b[i]) {
l = i;
break;
}
}
for (int i = n - 1; i >= 0; i--) {
if (a[i] != b[i]) {
r = i;
break;
}
}
int left = l, right = r;
boolean flag = true;
while (left <= r) {
if (a[left] != b[right]) {
System.out.println(0);
flag = false;
break;
} else {
left++;
right--;
}
}
if (flag) {
int ans = 1;
l--;
r++;
while (l >= 0 && r < n) {
if (a[l] == a[r]) {
ans++;
l--;
r++;
} else {
break;
}
}
System.out.println(ans);
}
}
}
题目描述
小红是一个有趣而聪明的数学爱好者。最近,他面临了一个有趣的挑战。他拿到了两个长度为 n 的数组 a 和 b,他发现这两个数组之间有一些位置上的元素不同。于是,小红想知道仅通过一次翻转操作,有多少种不同方式可以使得数组 a 和 b 完全相同。
在这个挑战中,小红需要选择 a 数组中的一个区间 [L,R] 并将其翻转。例如,对于数组 a={2,3,4,1,5,6},小红可以选择区间 [3,7],数组 a 则变成 {2,3,6,5,1,4}。
输入描述
第一行输入一个正整数 n,代表两个数组的长度。
第二行和第三行分别为长度为 n 的数组 a 和 b。
1≤n,ai,bi≤104
输出描述
输出一个整数表示答案。
6
1 2 3 4 5 1
1 5 4 3 2 1
2