#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