iOS——一维数组

本文介绍了数组的基本概念、定义及初始化方法,并详细讲解了数组的遍历、排序等操作技巧。此外,还探讨了字符串的长度计算、拷贝、拼接及比较方法。

数组: 是一种构造数据,因为数组中的数据都是一个个基本数据类型组成的。

定义数组的时候,需要注意一下几点:

*     数组元素的个数,不能使用变量,只能使用常量表达式,或者符号常量

int arr[3*2] = {1,2,3,4,5,6}; 其中3*2 就是常量表达式;

*      如果我们没有完全厨师化数组,其余的部分数据,系统会默认给我们的数组赋值为0;
*        定义数组的时候,如果没有指定数组的长度,那么数组元素的个数由我们往数组中输入的个数来决定。

sizeof(数据类型/变量名) : 计算数据类型在内存中所占用的字节数,如果括号内是变量名,结果即为该变量的总长度。

int arr[5] = {1,2,3,4,5};
unsigned long size = sizeof(arr/int); 结果为20/4
printf(“size = %lu\n”,size);

sizeof 的返回值是无符号长整型(没有正负),只能是个正数占位符号为 “%lu”

// 定义一个整型数组 确定元素的个数
int arr[5] = {1,2,3,4,5,6,7};
// 数组元素的个数 = 数组所占的总字节数 / 数组的数据类型
int count = sizeof(arr) / sizeof(int);

访问数组arr[i]某个元素的步骤:
数组名[下标],下标的值为i-1,从0~i-1;
注意数组的越界:printf(“arr[6] = %d\n”,arr[6]); 错误!

遍历:
使用for循环把数组中的所有元素打印出来的操作,叫做数组的遍历,遍历是数组的下标,通过数组下标的改变取出数组中的每一个元素。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                                            练习笔记:

1. 类型转换

int sum = 100;
float a = 0;
a = sum*1.0 / 8; 或者 a = sum(float) / 8;

  1. 两个数组同位置相加并放到另外一个数组中

for (int i = 0; i < 10; i++) {
arr[i] = arc4random_uniform(40-20+1)+20;
arr1[i] = arc4random_uniform(40-20+1)+20;
a = arr[i]+arr1[i];
arr2[i] = a;

  1. 三目运算求最值

n = max < arr [i] ? max : arr[i]; //最大值
n = min <= arr[i]?min:arr[i]; // 最小值

    1. 冒泡排序

int arr[10] = {0};
for ( int i = 0; i < 10 - i; i++ )
{
arr[ i ] = arc4random_uniform(30 - 10 +1 ) +10 ;
printf(“%d\t”,arr[ i ] );
}
printf (“\n”); // 第一步 为数组赋值

for( int i = 0; i < 10-i-1; i++)
{ // 外层进行控制比较趟数
for( int j = 0; j< 10 -i -1; j++)
{ // 内层控制比较次数
if ( arr [ j ] > arr [ j+1] )
{
int temp = arr [ j ];
arr [ j ] = arr [ j+1 ];
arr[ j+1 ] = temp;
}
}
} // 第二步 进行由大到小排序
for ( int i = 0; i < 10; i ++)
{
printf ( “%d\t ”,arr [i] );
} // 第三步 经过十次循环,将上个for循环得到的 arr[0]~arr[10]的值输出

  1. 利用strlen(字符串名) 计算字符串的长度

char str[ ] = “ lanou”;
unsigned long len = strlen( str); // 只计算有效长度,遇\0停止。
printf ( “len = %lu\n”,len);

  1. 利用strcyp (字符串名) 将字符串进行拷贝

// strcpy( ) 的拷贝是覆盖式的,遇到 \0就停止,前面的字符串要足够大。
char str1[20] = “lanou”;
char str2[15] = “henan”;
strcpy(str1,str2);
printf(“%s\n”,str1);

  1. 利用strcat( ) 进行字符串的拼接

    // 将后面的字符串拼接到前面的字符串后,前面的字符串容量要足够大,遇到 \0 停止。
    char str8[30] = “lan”;
    char str9[15] = “o\0u”; // 添加了 \0 只会拼接前面的一个o
    strcat(str8, str9);
    printf(“%s\n”,str8);

  2. 利用strcmp()进行字符串的比较

//两个字符串进行减法运算,一旦发现差值不为零,就立刻返回差值,后面的不再进行比较。 遇到 \0 停止

char str8[30] = “lanou”;
char str9[15] = “lanuu”;

### C++ 中动态规划解决背包问题时的一维与二维 dp 数组区别 #### 一、二维 dp 数组的特点及其适用场景 在处理背包问题时,二维 `dp` 数组通常定义为 `dp[i][j]`,其中 `i` 表示前 `i` 件物品,`j` 表示当前背包容量。这种表示方法的优点在于逻辑清晰直观,能够清楚地展示状态转移的过程。 当使用二维数组时,状态转移方程可以写作: ```cpp dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]); ``` 这里的 `w[i]` 和 `v[i]` 分别代表第 `i` 件物品的重量和价值。由于每次计算都需要依赖于之前的状态(即 `dp[i-1][...]`),因此需要按照行优先的方式填充表格,并且对于每一行中的列索引 `j` 需要从小到大遍历[^1]。 适用于以下情况: - 数据规模较小或者内存资源充足的情况下; - 更加注重可读性和调试便利性的场合; #### 二、一维 dp 数组的特点及其适用场景 为了节省空间复杂度,可以通过压缩维度的方法将二维数组转化为一维数组来实现相同的功能。此时只需要维护一个长度等于背包总容量加一的一维数组即可完成整个过程: 设 `dp[j]` 表达的是只考虑前面若干个物件,在不超过体积限制 j 的前提下所能获得的最大效益,则更新规则如下所示: ```cpp for (int i=1;i<=n;i++) { for(int j=m; j>=weight[i]; --j){ dp[j]=max(dp[j], dp[j-weight[i]]+value[i]); } } ``` 采用这种方式的好处显而易见——极大地减少了所需的存储空间需求,尤其适合那些涉及较大数值范围的问题实例。然而需要注意一点就是循环方向发生了变化:外层依旧按照物体编号升序执行迭代操作不变的前提下,内嵌的那个针对剩余可用载荷变量 j 执行降序扫描动作变得至关重要了。这是因为如果还是沿袭先前那种自低向高推进模式的话,就有可能造成重复利用同一件商品的现象发生违背题目设定条件的情况出现[^4]。 #### 三、两者对比分析 | **比较项** | **二维 DP 数组** | **一维 DP 数组** | |---------------------|----------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------| | **时间复杂度** | O(n * m),其中 n 是物品数量, m 是背包容量 | O(n * m) | | **空间复杂度** | O(n * m) | O(m) | | **优点** | 易理解,便于追踪每一步骤的具体状态 | 占用更少的空间 | | **缺点** | 当面对大规模输入数据集时可能会超出内存限制 | 实现细节稍显晦涩难懂 | 综上所述,选择哪种形式取决于具体的应用环境以及个人偏好等因素综合考量后的决定结果[^2]。 ```cpp // 示例代码片段 - 使用一维DP解决0/1背包问题 #include <iostream> using namespace std; const int MAX_W = 1e5; long long w[MAX_W]; long long val[MAX_W]; void solve(long long N, long long W){ vector<long long> dp(W+1, 0); for(long long i=1;i<=N;++i){ for(long long j=W;j >=w[i];--j){ dp[j] = max(dp[j], dp[j-w[i]] +val[i]); } } } int main(){ ios::sync_with_stdio(false); cin.tie(0); long long N,W; cin>>N>>W; for(auto &x:w)x=cin.get(); for(auto &y:val)y=cin.get(); solve(N,W); cout<<dp[W]<<'\n'; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值