当前位置: 首页 > news >正文

个人学习编程(3-22) leetcode刷题

连续子数组:(难)

示例 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: 2
    printf("Test 2: %d\n", findMaxLength(nums2, 4)); // Expected: 4
    printf("Test 3: %d\n", findMaxLength(nums3, 6)); // Expected: 6
    printf("Test 4: %d\n", findMaxLength(nums4, 6)); // Expected: 6
    printf("Test 5: %d\n", findMaxLength(nums5, 5)); // Expected: 4
    printf("Test 6: %d\n", findMaxLength(nums6, 3)); // Expected: 0

    return 0;
}

今天晚上再看一遍把。难理解。。绕。。。

统计最大字符:

输入:aaaabbbbbbbbbbbbbbccc
输出:14 b

 C:

#include <stdio.h>
#include <string.h>
#define MAX_LEN 100

int 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();
}

相关文章:

  • C++智能指针详解
  • 蓝桥杯备赛 背包问题
  • [项目]基于FreeRTOS的STM32四轴飞行器: 十一.MPU6050配置与读取
  • 建筑安全员考试:“实战演练” 关键词助力的答题提升策略
  • Sqlite3数据库
  • 客服机器人怎么才能精准的回答用户问题?
  • Linux shell脚本-概述、语法定义、自定义变量、环境变量、预设变量、变量的特殊用法(转义字符、单双引号、大小括号)的验证
  • Labview和C#调用KNX API 相关东西
  • 《深度剖析:鸿蒙系统不同终端设备的UI自适应布局策略》
  • Linux系统管理与编程06:任务驱动综合应用
  • APIJSON快速入门
  • 西门子仿真实例位置
  • Linux小知识
  • SCI论文阅读指令(特征工程)
  • (学习总结29)Linux 进程概念和进程状态
  • solana增加流动性和删除流动性
  • Doris官网上没有的一些Fe参数了,都在源码中
  • HC-05与HC-06蓝牙配对零基础教程 以及openmv识别及远程传输项目的概述
  • Vala编程语言教程-面向对象编程语基础
  • Java-腾讯云短信模板兼容阿里云短信模板-短信模板参数生成
  • 普京发表声明感谢协助俄军收复库尔斯克州的朝鲜军人
  • 修订占比近30%收录25万条目,第三版《英汉大词典》来了
  • 柴德赓、纪庸与叫歇碑
  • 百岁太极拳大师、陈氏太极拳第十一代嫡宗传人陈全忠逝世
  • 专访|伊朗学者:美伊核谈不只是改革派立场,但伊朗不信任美国
  • 迟来的忍者与武士:从《刺客信条:影》论多元话语的争议