刘梦迪113 level
获赞
1
粉丝
2
关注
3
看过 TA
8
哈尔滨理工大学
2029
IP属地:黑龙江
暂未填写个人简介
私信
关注
11-27 08:30
哈尔滨理工大学
在C++中,结构体(struct) 是一种用户自定义数据类型,用于将不同类型的变量(成员)组合成一个整体,核心作用是“打包”相关数据,方便管理和使用。1. 结构体的基本定义与使用结构体通过  struct  关键字定义,语法如下,结合代码示例更易理解:代码:#include# includeusing namespace std;// 1. 定义结构体(相当于创建一个新的"数据模板")struct Student {// 成员变量:不同类型的数据string name;  // 姓名(string类型)int age;      // 年龄(int类型)float score;  // 分数(float类型)};  // 注意:结构体定义结尾必须加分号int main() {// 2. 声明结构体变量(使用"模板"创建具体数据)Student stu1;  // stu1 是 Student 类型的变量// 3. 给成员变量赋值(通过"变量名.成员名"访问)stu1.name = "张三";stu1.age = 18;stu1.score = 92.5;// 4. 访问并输出成员变量cout << "姓名:" << stu1.name << endl;cout << "年龄:" << stu1.age << endl;cout << "分数:" << stu1.score << endl;return 0;}输出结果:plaintext姓名:张三年龄:18分数:92.5
0 点赞 评论 收藏
分享
11-22 13:52
哈尔滨理工大学
1.末尾向开头遍历#include# includeusing namespace std;int main(){string s;cin >> s;// 从字符串最后一个字符开始,反向遍历到第一个字符for(int i = s.length() - 1; i >= 0; i--){cout << s[i];}cout << endl;return 0;}2.reverse#include# include#include   // 包含 reverse 函数using namespace std;int main() {string s;cin >> s;reverse(s.begin(), s.end());  // 反转字符串:begin()是起始迭代器,end()是结束迭代器cout << s << endl;return 0;}3.双指针#include# includeusing namespace std;int main() {string s;cin >> s;int left = 0;                  // 左指针:起始位置int right = s.length() - 1;    // 右指针:末尾位置while (left < right) {         // 两指针未相遇时,交换字符swap(s[left], s[right]);   // 交换左右指针指向的字符(C++内置swap函数)left++;                    // 左指针右移right--;                   // 右指针左移}cout << s << endl;return 0;}4.#include# includeusing namespace std;// 递归函数:逆序输出字符串 s(从索引 index 开始)void reverseString(const string& s, int index) {if (index == s.length()) {     // 递归终止条件:索引到达字符串末尾return;}// 先递归处理下一个字符(子问题:逆序输出 s[index+1 ... end])reverseString(s, index + 1);// 递归返回后,输出当前字符(子问题解决后,输出当前字符,实现逆序)cout << s[index];}int main() {string s;cin >> s;reverseString(s, 0);  // 从索引 0 开始递归cout << endl;return 0;}
0 点赞 评论 收藏
分享
11-13 09:50
哈尔滨理工大学
对于一个有序序列,我们可以用二分搜索的方式在该序列中搜索某个数值。以升序序列为例,二分搜索首先确定搜索的范围(即搜索序列的第一个元素的位置 left 和最后一个元素的位置 right),然后计算出中间位置 mid。比如我们要搜索的序列是:2, 7, 11, 19, 23, 31, 33, 39。在初始的状态下,搜索范围是整个序列,那么第一个元素的位置left就是1,最后一个元素的位置right就是8,mid = (left + right)/2 = 4(注意序列的长度是偶数,left+right的和是奇数,这里对结果进行了向下取整)。接下来,检查中间位置的元素是否是要搜索的值 target(假设我们要搜索的值是31,那么target就等于31),如果不是,则比较中间元素与 target 的大小关系:如果中间位置的元素比target大,因为序列是升序的,所以 target 只可能在中间元素的左侧,也就是位于 left 和 mid - 1之间,此时把 right 更新为 mid - 1,也就是说,下一次我们要搜索的范围的右边界发生了变化。更新right后,再次计算新的mid,重复上面的搜索过程;如果中间位置的元素比 target 小,那么 target 只可能位于 mid + 1 和 r 之间,此时把 l 更新为 mid + 1(这种情况是左边界发生了变化)后,重复上面的搜索过程。在搜索过程中,一旦发现某一次,搜索范围中间的值等于target,那么就是找到了目标值;或者始终找不到的情况下,当left > right的时候,我们就知道target不在我们搜索的序列中,此时搜索也就结束了。以在序列(2, 7, 11, 19, 23, 31, 33, 39)中搜索31为例,说明一下二分搜索的流程。第一轮搜索:left = 1,right = 8(注意在大多数编程语言中,数组下标是从0开始的),mid = (1 + 8) / 2 = 4,序列中第四个元素是19,19小于要搜索的目标值31,因此31只可能在序列的后半段,此时更新左侧边界left,把left赋值为mid + 1,此时left变成了5;第二轮搜索:left = 5,right = 8,mid = (5 + 8) / 2 = 6,序列中第6个元素是31,此时找到了目标元素,其在序列中的位置是6,搜索结束。再以要搜索的值是30为例,我们从刚才的第二轮搜索继续。到了上面的第二轮搜索,序列中第6个元素是31,大于30,那么30只可能存在于第5个元素(left的值为5)的右侧、31(第6个元素)的左侧,此时更新right,将其赋值为mid - 1,此时right变成了5。继续进行第三轮搜索。第三轮搜索:left = 5,right = 5,mid = (5 + 5) / 2 = 5。序列中第5个元素是23,小于30,此时更新left为mid + 1,left的值变为6,继续进行第四轮搜索。第四轮搜索:在进行搜索前,发现left的值已经大于right,这时可以确定要搜索的值不在序列中,搜索结束。#include# includeusing namespace std;int main() {int n;cin >> n;vector nums(n);for (int i = 0; i < n; i++) {cin >> nums[i];}int V;cin >> V;int left = 0, right = n - 1;int pos = -1;while (left <= right) {int mid = (left + right) / 2;if (nums[mid] == V) {pos = mid + 1;  // 位置从1开始编号,所以加1break;} else if (nums[mid] < V) {left = mid + 1;} else {right = mid - 1;}}if (pos != -1) {cout << pos << endl;} else {cout << "Value not found." << endl;}return 0;}
0 点赞 评论 收藏
分享

创作者周榜

更多
关注他的用户也关注了:
牛客网
牛客网在线编程
牛客网题解
牛客企业服务