排序子序列,倒置字符串

    xiaoxiao2022-07-05  161

    问答题

    问答题1:下面叙述错误的是 char acX[]=“abc”; char acY[]={‘a’,‘b’,‘c’}; char *szX=“abc”; char *szY=“abc”;

    (A) acX与acY的内容可以修改 (B) szX与szY指向同一个地址 (C) acX占用的内存空间比acY占用的大 (D) szX的内容修改后,szY的内容也会被更改

    提示:对于acX 和 acY 的字符串是保存在栈空间数组里,所以可以修改,szX 和 szY 指向了同一个字符串abc,所以他们指向的是一个地址,但是指针地址并不相同;acX 比 acY多一个\0 ;szX中的内容是无法修改的.

    问答题2:下列代码运行结果是?

    int a[]={1,2,3,4}; int *b=a; *b+=2; *(b+2)=2; b++; printf("%d,%d\n",*b,*(b+2));

    提示:第三行和第四行是赋值,指针并没有往前走,第五行指针才走了一步.

    问答题3:在32位 cpu 上选择缺省对齐的情况下,下列程序输出什么?

    struct A { unsigned a:19; unsigned b:11; unsigned c:4; unsigned d:29; char index; }; cout << sizeof(struct A) << endl;

    这是一个位段的问题,可以节省空间,因为其内存分配和结构体对齐是不一样的,有个缺陷就是,不可移植无法跨平台.

    一共占据 4 个 32位,一个32位是4个字节,所以sizeof(A)为16字节.

    问答题4:关于c++的inline关键字,哪个说法正确?

    A 使用inline关键字的函数会被编译器在调用处展开

    错误,inline 只是用户对编译器的建议,但是编译器有权利忽略,特别是对于一些复杂函数,如果被展开,会很复杂.

    B 头文件中可以包含inline函数的声明

    在函数的定义面前加 inline 才有作用,在声明前是无效果的.所以当函数被展开前,会在文件中寻找内联函数的定义,如果没有定义则不会展开.

    C 可以在同一个项目的不同源文件内定义函数名相同但实现不同的inline函数

    函数名相同的两个函数,即使在不同文件,但是他们的实现一定要是相同的.否则会有未定义的行为,所以建议把内联函数放在头文件,这样就不需要程序猿去拷贝了.也就只有一个定义了.

    D 定义在Class声明内的成员函数默认是inline函数

    定义在类声明之中的成员函数将自动地成为内联函数

    E 优先使用Class声明内定义的inline函数 F 优先使用Class实现的内inline函数的实现

    inline 关键字没有优先级的功能

    编程题

    编程题1:排序子序列

    牛牛定义排序子序列为一个数组中一段连续的子序列,并且这段子序列是非递增或者非递减排序的。

    牛牛有一个长度为n 的整数数组A,他现在有一个任务是把数组A分为若干段排序子序列,牛牛想知道他 最少 可以把这个数组分为几段排序子序列.

    例:数组A划分为[1,2,3] 和 [2,2,1]两个排序子序列,至少需要划分为2个排序子序列,所以输出:2

    输入描述:输入的第一行为一个正整数n(1 ≤ n ≤ 10^5) 第二行包括n个整数A_i(1 ≤ A_i ≤ 10^9),表示数组A的每个数字

    输出描述:输出一个整数表示牛牛可以将A最少划分为多少段排序子序列

    输入 6 1 2 3 2 2 1 输出 :2

    题目分析:在第一次看题的时候感觉题特别矛盾,要求子序列是非递增的,那例题给出数组 1 2 3 不就是递增的吗?在这个问题上就纠结了好久,我感觉我语文水平不是很高~~!!后来才明白子序列的要求是非递增或者非递减,只要满足其中一个要求就是 子序列了。还有一个注意的就是:非递增并不等于与递减,而非递减也并不等于递增…意思就是,1 2 2 2 并不是递增,但它是非递减;用数学角度来看 a(N) =< a(N+1) 就是非递减,而递增是 a(N) < a(N+1);

    思路分析:根据题意的分析,所分割出来的数组是非递增或者非递减的, 例如这个数列:红框前面都是非递减的,这里突然递减了,所以 红框这里必须要分开,反之也是一样,如果前面的数列是非递增的,然后突然出现了比前一个小的数字就必须分开;

    #include <iostream> #include <vector> using namespace std; int main(){ int n; while(cin>>n){ vector<int>v(n,0); for(int i=0;i<n;++i){ cin>>v[i]; } int count = 0; // 进行判断 for(int i = 1;i<n+1;++i){ // 如果后者大于前面则找到一个不满足条件的 if(v[i-1]<v[i]){ while(i<n && v[i-1]<=v[i]){ ++i; } // 然后加次数 ++count; }else if(v[i-1]>v[i]){ while(i<n && v[i]<v[i-1]){ ++i; } ++count; } } cout<<count<<endl; } return 0; }

    编程题2:倒置字符串

    输入用例长度不超过100;依次输出倒置之后的字符串,以空格分割:

    输入:I like beijing. 输出:beijing. like I

    C语言版

    #include <stdio.h> #include <stdlib.h> #include <string.h> void reverse(char* start, char* end){ while (start < end){ char tmp = *start; *start = *end; *end = tmp; start++; end--; } } void str_reverse(char* str){ int len = strlen(str); reverse(str, str + len - 1); //全部逆置 while (*str != '\0'){ char* pos = str; while ((*str != ' ') && (*str != '\0')){ str++; } reverse(pos, str - 1); //每个单词的逆置 if (*str != '\0'){ str++; } } } int main(){ char str[100]; printf("原字符串:"); scanf("%[^\n]", &str); str_reverse(str); printf("翻转后的字符串为:%s\n", str); system("pause"); return 0; }

    C++版

    #include <iostream> #include <string> #include <algorithm> using namespace std; int main(){ string str; getline(cin,str); // 全部逆置 reverse(str.begin(),str.end()); auto start = str.begin(); // 单词逆置 while(start < str.end()){ auto end = start; while(end != str.end()&& *end != ' '){ ++end; } reverse(start,end); if(end != str.end()){ start = end+1; }else{ start = end; } } cout<<str<<endl; return 0; }

    大牛版

    #include<iostream> #include<string> using namespace std; int main(){ string s1, s2; //cin读取string时自动会被空格分隔开,用另一个字符串存储进行逆序输出 cin >> s2; while (cin >> s1){ s2 = s1 + " " + s2; } cout << s2 << endl; return 0; }

    python 版

    print(' '.join((input().strip().split()[::-1])))

    上面一行代码可以写成下面这样

    # 接收字符串,strip 的含义是去掉首位的空白字符 str = input().strip() # 通过空格对字符串分割,并返回一个列表, str = str.split() # 逆置列表中的元素 str = str[::-1] # 将列表转换为字符串,并输出 print(' '.join(str))
    最新回复(0)