小苯的九宫格,小苯的好数组(排序),小苯的数字合并(字典树,前缀和)

简介: 小苯的九宫格,小苯的好数组(排序),小苯的数字合并(字典树,前缀和)

小苯的九宫格

题目描述

运行代码

#include<iostream>
using namespace std;
int main(){
  int a[10];
  for(int i=1;i<=9;i++){
    cin>>a[i];
  } 
  string b;
  cin>>b;
  for(int i=0;i<b.size();i++){
    int p=b[i]-'0';
    cout<<a[p];
  }
}

代码思路

  1. 定义数组:首先,定义了一个整型数组a,用于存储10个整数。但需要注意的是,在C++中,数组的索引通常从0开始,而不是从1开始。然而,这里的循环是从1开始的,这意味着数组的第一个元素a[0]没有被使用。
  2. 输入数组:通过一个for循环,从a[1]a[9]输入9个整数。这意味着a[0]的值是未定义的(可能包含垃圾值)。
  3. 输入字符串:接着,代码读取一个字符串b
  4. 处理字符串并输出数组元素:再次使用一个for循环遍历字符串b的每一个字符。
  • 在循环内,首先将字符b[i]转换为其对应的整数p。这是通过从字符中减去字符'0'的ASCII值来实现的。在ASCII中,数字字符'0'到'9'是连续的,所以这种减法可以得到字符所代表的整数值。
  • 然后,代码尝试输出数组a中索引为p的元素。但是,由于之前的数组输入是从1开始的,如果b中的某个字符表示的数字是0(即p为0),则程序会尝试访问a[0],这是一个未定义的值。此外,如果b中的某个字符表示的数字大于9(即p大于9),则程序会访问数组a的越界位置,这会导致未定义行为(通常是程序崩溃)

小苯的好数组(排序)

题目描述

运行代码

#include<iostream>
#include<vector>
using namespace std;
inline int FN(){
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9')
    {
        if(c=='-')
            f=-f;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        x=x*10+c-'0';
        c=getchar();
    }
    return x*f; 
}
int a[200010];
signed main(){
  int n=FN();
  for(int i=1;i<=n;i++)
    a[i]=FN();
  bool o=0;
  for(int i=1;i<=n;i++)
    o|=(a[i]<a[i-1]);
  if(o)
        cout<<n<<endl;
  else 
        cout<<0;
    return 0;
}

代码思路

  1. FN 函数:这是一个用于读取整数的函数,它可以处理正数和负数。
  • 首先,它初始化一个整数 x 为 0 和一个标志 f 为 1(用于处理负数)。
  • 然后,它读取一个字符 c 并检查它是否是数字。如果不是,它会继续读取直到找到数字或负号。
  • 如果找到负号,它将 f 设置为 -1。
  • 接下来,它会读取所有的数字字符,并将它们转换为整数。
  • 最后,它返回 x * f,这样如果 f 是 -1,那么 x 就会被取反。
  1. 主函数
  • 首先,它使用 FN 函数读取一个整数 n,表示要读取的整数数量。
  • 然后,它使用一个 for 循环读取 n 个整数并存储在数组 a 中。注意,这里从 a[1] 开始存储,但数组通常从 a[0] 开始。
  • 接下来,它使用一个布尔变量 o 来跟踪数组是否是降序的。它初始化为 false(在C++中,bool 类型的 0 被视为 false)。
  • 它再次使用一个 for 循环遍历数组,并检查每个元素是否小于其前一个元素。如果是,它将 o 设置为 true。但是,这里有一个潜在的问题:当 i=1 时,a[i-1] 实际上是 a[0],而 a[0] 没有被初始化或赋值,这可能导致未定义的行为。
  • 最后,根据 o 的值,它输出 n0

小苯的数字合并(字典树,前缀和)

题目描述

运行代码

#include <bits/stdc++.h>
#include<iostream>
using namespace std;
int main()
{
  int n;
    cin>>n;
    int a[200005];
    long long sum[200005];
    sum[0]=0;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        sum[i]=sum[i-1]+a[i];
    }
    long long ans=0;
    if(n==1)
    {
        return 0;
    }
    long long m=1e9;
    for(int i=1;i<=n;i++)
    {
        if(a[i]<m)
        {
            m=a[i];
        }
        ans=max(sum[n]-sum[i]-m,ans);
        ans=max(sum[i-1]-a[i],ans);
    }
    cout<<ans;
  return 0;
}

代码思路

  1. 输入与初始化:输入整数n,表示序列的长度。定义数组a[200005]存储序列中的每个元素。
    定义数组sum[200005]用于存储序列的累积和,其中sum[i]表示序列前i个元素的和。初始化sum[0]=0
  2. 读取序列与计算累积和:读取序列中的每个元素a[i],并计算累积和数组sum,使得sum[i] = sum[i-1] + a[i]
  3. 寻找分割点以最大化“不完美度”
  • 初始化变量ans为0,用于记录最大的“极差”。
  • 用一个变量m来追踪到目前为止序列中的最小值,初始值设为1e9(一个很大的数,确保任何正整数都会比它小)。
  • 遍历序列,对于每个位置i(从1到n):更新m为当前位置i处的元素a[i]和当前最小值m中的较小者。计算两种分割情况下的“不完美度”:第一种情况:分割点在i,左边部分的不完美度为当前m,右边部分的不完美度由累积和计算得来,即sum[n] - sum[i] - m
  • 第二种情况:实际上是一种特例,当分割点在i左侧的最后一个位置时,左边所有元素的总和减去a[i]
  • 更新ans为上述两种情况中的较大值。
  1. 输出结果:循环结束后,ans中存储了最大的“差”,将其输出。
目录
相关文章
|
11月前
|
算法 测试技术 C#
C++二分查找算法:查找和最小的 K 对数字
C++二分查找算法:查找和最小的 K 对数字
|
11月前
|
算法
【LeetCode】每日一题&&两数之和&&寻找正序数组的中位数&&找出字符串中第一个匹配项的下标&&在排序数组中查找元素的第一个和最后一个位置
【LeetCode】每日一题&&两数之和&&寻找正序数组的中位数&&找出字符串中第一个匹配项的下标&&在排序数组中查找元素的第一个和最后一个位置
|
6月前
|
算法
LeetCode算法题---无重复字符的最长子串、寻找两个正序数组的中位数(三)
LeetCode算法题---无重复字符的最长子串、寻找两个正序数组的中位数(三)
62 0
|
15天前
(剑指Offer)04、二维数组中的查找11、旋转数组的最小数字50、第一个只出现一次的字符(2021.12.02)
(剑指Offer)04、二维数组中的查找11、旋转数组的最小数字50、第一个只出现一次的字符(2021.12.02)
27 1
|
6月前
|
人工智能 算法 BI
【前缀和】【分类讨论】【二分查找】2983:回文串重新排列查询
【前缀和】【分类讨论】【二分查找】2983:回文串重新排列查询
|
6月前
|
算法 Java C++
实现一个二分搜索算法,搜索指定元素在已排序数组中的位置。(递归或者非递归实现)
实现一个二分搜索算法,搜索指定元素在已排序数组中的位置。(递归或者非递归实现)
42 0
|
6月前
|
算法 程序员 索引
【算法训练-二分查找 一】【基本二分】二分查找、在排序数组中查找元素的第一个和最后一个位置
【算法训练-二分查找 一】【基本二分】二分查找、在排序数组中查找元素的第一个和最后一个位置
56 0
|
算法
【LeetCode】33. 搜索旋转排序数组、1290. 二进制链表转整数
目录 33. 搜索旋转排序数组 1290. 二进制链表转整数
34 0
【LeetCode】33. 搜索旋转排序数组、1290. 二进制链表转整数
剑指offer-1.找出数组中重复的数字
剑指offer-1.找出数组中重复的数字
30 0
|
C++
剑指offer 01. 找出数组中重复的数字
剑指offer 01. 找出数组中重复的数字
50 0