連續子數組:(難)
示例 1: 輸入: nums = [0,1]
輸出: 2
說明: [0, 1] 是具有相同數量 0 和 1 的
最長連續子數組。
示例 2:
輸入: nums = [0,1,0]
輸出: 2
說明: [0, 1] (或 [1, 0]) 是具有相同數量0和1的最長連續子數組。
?需要理解的知識:
//count0(i,j) = count0(0,j) - count0(0,i-1);
例如: count0(3,5) = count0(0,5)-count0(0,2);
#include <stdio.h>int cindex(int j){return j + 1;
}int findex(int j, int numsSize) {return j + numsSize;
}int findMaxLength(int* nums, int numsSize) {int countDiffSize = numsSize + 1;int countDiff[countDiffSize];countDiff[cindex(-1)] = 0;for (int k = 0; k < numsSize; k++){if (nums[k] == 0){countDiff[cindex(k)] = countDiff[cindex(k - 1)] + 1;}else{countDiff[cindex(k)] = countDiff[cindex(k - 1)] - 1;}}int findMaxJSize = 2 * numsSize + 1;int findMaxJ[findMaxJSize];for (int k = -numsSize; k < numsSize; k++){findMaxJ[findex(k, numsSize)] = -1;}for (int j = 0; j < numsSize; j++){findMaxJ[findex(countDiff[cindex(j)], numsSize)] = j;}int maxLength = 0;for (int i = 0; i < numsSize; i++){int target = countDiff[cindex(i-1)];int length = findMaxJ[findex(target, numsSize)] - i + 1;if (length > maxLength){maxLength = length;}}return maxLength;
}int main() {int nums1[] = {0, 1};int nums2[] = {0, 1, 0, 1};int nums3[] = {0, 1, 1, 0, 1, 0};int nums4[] = {1, 1, 1, 0, 0, 0};int nums5[] = {1, 0, 1, 1, 0};int nums6[] = {1, 1, 1};printf("Test 1: %d\n", findMaxLength(nums1, 2)); // Expected: 2printf("Test 2: %d\n", findMaxLength(nums2, 4)); // Expected: 4printf("Test 3: %d\n", findMaxLength(nums3, 6)); // Expected: 6printf("Test 4: %d\n", findMaxLength(nums4, 6)); // Expected: 6printf("Test 5: %d\n", findMaxLength(nums5, 5)); // Expected: 4printf("Test 6: %d\n", findMaxLength(nums6, 3)); // Expected: 0return 0;
}
今天晚上再看一遍把。難理解。。繞。。。
統計最大字符:
輸入:aaaabbbbbbbbbbbbbbccc
輸出:14 b
?C:
#include <stdio.h>
#include <string.h>
#define MAX_LEN 100int main() {char str [MAX_LEN];int count[26] = { 0 };int max_count = 0;char result_char;//輸入:fgets(str,MAX_LEN,stdin);//統計次數:for (int i = 0; str[i] != '\0'; i++){if (str[i] >= 'a' && str[i] <= 'z'){count[str[i] - 'a']++;} }//輸出:for (int i = 0; i < 26; i++){if (count[i] > max_count){max_count = count[i];result_char = 'a' + i;}else if (count[i] == max_count){if ('a' + i <result_char){result_char = 'a' + i;} }}printf("%d %c",max_count,result_char);
}
C++:
C++還是好用一些,在sort排序之后,即使兩者的數量相同了,因為我們排序的原因,就可以使輸出的仍然是較小值的i
C語言輸入字符串
char s[100];
fgets(s,100,stdin);
但是C++輸入一個字符串:
// 讀取輸入 cout << "Enter a string: ";
getline(cin, s); // 使用 getline 讀取包含空格的字符串
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;string s; //輸入的字符串
int maxn = 0;
char ch = '\0';//初始化頻率最高的字符為'\0';void Max() {for (int i = 0; i < s.size(); i++){//利用 sort 計算字符 s[i] 在字符串中的出現次數int cnt = count(s.begin(),s.end(),s[i]);//保證先 sort() 再 Max() 這樣就不用判斷相等輸出最小值i了if (cnt > maxn){maxn = cnt;ch = s[i];}}
}int main() {//讀取輸入:cout << "Enter a string:~";getline(cin,s);sort(s.begin(),s.end());Max();cout << "character: " << ch << " frequency:" << maxn << "" << endl;
}
?出現次數超過一半的數:
給出一個含有n(0<n<= 1000)個整數的數組,請找出其中出現次數超過一半的數。數組中的數大于-50月小于50。
【輸入】
第一行包含一個整數n,表示數組大小;
第二行包含n個整數,分別是數組中的每個元素,相鄰兩個元素之間用單個空格隔開。【輸入樣例】
1 2 2
【輸出樣例】
2
C++用count? if (count(a,a+n,a[i])>n/2) return true;
#include <bits/stdc++.h>
#include <iostream>
using namespace std;const int N = 1001;
int a[N], n;void Input(){cin >> n;for (int i = 0; i < n; i++){ // 這里應該是 i < n,避免讀取多余元素cin >> a[i];}
}void Output(){for (int i = 0; i < n; i++){ // 這里應該是 i < n,避免檢查多余元素if (count(a, a + n, a[i]) > n / 2){cout << a[i];return;}}cout << "0";
}int main() {Input();Output();return 0;
}
?明明的隨機數:
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;const int N = 1001;
int arr[N];
int n;
void Input() {cin >> n;for (int i = 0; i < n; i++){cin >> arr[i];}return;
}void Output() {int index = unique(arr, arr + n) - arr;int cnt = index;cout << cnt << endl;for (int i = 0; i < cnt; i++){cout << arr[i] << ' ';}
}int main() {Input();sort(arr,arr + n);Output();
}