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

【寒假小练】day2

前言

日积跬步,能至千里。

水平有限,不足之处望请斧正。


选择题

1、以下程序运行后的输出结果是( )

#include <stdio.h>
void fun(char **p) {
		int i;
		for(i = 0; i < 4; i++) {
				printf("%s", p[i]); 
    }
int main() {
		char *s[6] = {"ABCD", "EFGH", "IJKL", "MNOP", "QRST", "UVWX"}; 
  	fun(s);
		printf("\n");
		return 0;
}

A:ABCDEFGHIJKL

B:ABCD

C:AEIM

D:ABCDEFGHIJKLMNOP


char *s[6]

s是字符指针数组,每个元素是char*

"ABCD", "EFGH"等都是字符串常量,会被看作char*的指针,存放在常量区。

fun(s)

数组传参时降维成指向其首元素的指针,即char**

fun内的p[i]会拿到s[0], s[1], ..., s[3],即"ABCD", "EFGH", "IJKL", "MNOP"的地址。按%s的格式打印。

正确答案:D


#字符串常量(字符串字面量)

int main()
{
    char* str;
    
    str = "a string";
    
    printf("%s\n", str);
    
    return 0;
}
  • str:字符指针,存于栈区
  • "a string":字符串常量,存于常量区

用一双引号括起来的一串字符序列,在C语言中被看作 字符串常量

C语言会将字符串常量看作只读的字符数组,所以它也是char*的指针。如,

printf("%s\n", "test");

调用printf时,会传递"test"的地址,即常量区中存储字符t的内存单元的地址。


2、数组 a 的定义为: int a[3][4]; 下面哪个不能表示 a[1][1] ( )

A:*(&a[0][0]+5)

B:*(*(a+1)+1)

C:*(&a[1]+1)

D:*(a[1]+1)


int a[3][4]

在这里插入图片描述

a是整个数组(int [3][4])的数组名,a = &a[0],类型为int (*)[4]

a[0]是第0行(int [4])的数组名,a[0] = &a[0][0],类型为int*


A:&a[0][0] == a[0]a[0]类型为int*,又因为数组是连续存储,所以*(a[0] + 5) == a[1][1]。可以表示。

B:a = &a[0],类型为int (*)[4]&a[0] + 1 = &a[1]*(&a[1]) == a[1]

a[1] = &a[1][0],类型为int*&a[1][0] + 1 == &a[1][1]*(&a[1][1]) == a[1][1]。可以表示。

C:&a[1] = a + 1,类型为int (*)[4]&a[1] + 1 == &a[2]*(&a[2]) == a[2]。无法表示。

D:a[1] = &a[1][0],类型为int*&a[1][0] + 1 == &a[1][1]*(&a[1][1]) == a[1][1],可以表示。

正确答案:C


总结

数组名是首元素地址,如对于二维数组int a[3][4]

  • a = &a[0]
  • a[0] = &a[0][0]

3、void (*s[5])(int)表示意思为( )

A:函数指针

B:函数指针数组

C:数组指针函数

D:语法错误


老方法:通过优先级判断名字和谁结合,要么是数组,要么是指针,剩下的就是数组元素类型或指针指向的数据类型。

优先级:[] > *

s和[5]结合,代表这是数组。剩下的void (*)(int)代表数组的元素是无返回值、有一个int参数的函数指针。所以这是函数指针数组。

正确答案:B


总结
通过优先级判断名字和谁结合,要么是数组,要么是指针,剩下的就是数组元素类型或指针指向的数据类型。


4、在64位操作系统上,下面程序返回结果是( )

int main() {
		int *k[10][30]; 
  	printf("%d\n", sizeof(k)); 
  	return 0;
}

A:4

B:8

C:1200

D:2400


64位操作系统,内存单元的编号有64位二进制数来描述,所以指针的大小为64bits == 8bytes300 * 8 = 2400

正确答案:D


总结

指针大小:32位下4bytes,64位下8bytes


5、假设函数原型和变量说明如下,则调用合法的是( )

void f(int **p);

int a[4]={1,2,3,4};
int b[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; 
int *q[3]={b[0],b[1],b[2]};

A:f(a);

B:f(b);

C:f(q);

D:f(&a);


f需要int**类型的参数。

A:a = &a[0],类型为int *。不符合。

B:b = &b[0],类型为int (*)[4]。不符合。

C:q = &q[0],类型为int **。符合。

D:&aa的地址,类型为int (*)[4]。不符合。


总结

数组名是首元素地址,两个例外:

  • &数组名取整个数组的地址
  • sizeof(数组名):计算整个数组的大小

编程题

1. 第一个只出现一次的字符

描述

在一个长为 n 字符串中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)

数据范围:100000≤n≤10000,且字符串只有字母组成。

要求:空间复杂度 O(n),时间复杂度O(n)

示例1

输入:

"google"

返回值:

4

示例2

输入:

"aa"

返回值:

-1

思路

出现次数……这不就是我们之前提过的hash映射的思想嘛:构建哈希表,统计每个字符出现次数,最后再次遍历,第一个出现次数为1的就是要找的。


参考代码

class Solution {
public:
    int FirstNotRepeatingChar(string str) {
        vector<int> hash(128);

        for(auto e : str)
        {
            ++hash[e];
        }
        for(size_t i = 0; i < str.size(); ++i)
        {
            if(hash[str[i]] == 1) return i;
        }

        return -1;
    }
};

2. 判定字符是否唯一

实现一个算法,确定一个字符串 s 的所有字符是否全都不同。

示例 1:

输入: s = "leetcode"
输出: false 

示例 2:

输入: s = "abc"
输出: true

限制:

  • 0 <= len(s) <= 100
  • s[i]仅包含小写字母

思路

同样的hash思想也能解决:某个字符出现了两次就代表有相同的字符。


参考代码

class Solution {
public:
    bool isUnique(string astr) {
        vector<int> hash(128);

        for(auto e : astr)
        {
            ++hash[e];
            if(hash[e] > 1) return false;
        }
        
        return true;
    }
};

总结

查找还得hash


#字符串常量


今天的分享就到这里了

这里是培根的blog,期待与你共同进步!

下期见~

相关文章:

  • 指针(基础)
  • 新来测试用一手Postman实现UI自动化测试拿下了大厂面试官
  • 实时即未来,大数据项目车联网之驾驶行程采样实时分析【十七】
  • python进阶——人工智能视觉识别
  • 一文解决Opencv四大经典算子——sobel算子、scharr算子、laplacian算子、canny算子
  • 灰色预测模型一文详解+Python实例代码
  • Spring泛型处理源码详解,Java泛型处理
  • String类——Java中常见的类(模拟登录案例练习)
  • 从C语言的使用转换到C++(下篇)——刷题、竞赛篇
  • 【C++修行之路】C++入门之深剖变量
  • 【自然语言处理】情感分析(五):基于 BERT 实现
  • C++STL入门:string的基本使用小笔记
  • 【CANoe示例分析】EthernetCanGW_Test_CN
  • 下班前几分钟,我彻底弄懂了并查集
  • 【GIS前沿】什么是新型基础测绘、内容、产品体系、特征?
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 2019年如何成为全栈工程师?
  • 3.7、@ResponseBody 和 @RestController
  • AHK 中 = 和 == 等比较运算符的用法
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • axios 和 cookie 的那些事
  • Bytom交易说明(账户管理模式)
  • docker-consul
  • JavaScript 基础知识 - 入门篇(一)
  • Mysql5.6主从复制
  • PaddlePaddle-GitHub的正确打开姿势
  • react-native 安卓真机环境搭建
  • React系列之 Redux 架构模式
  • Sublime text 3 3103 注册码
  • vuex 学习笔记 01
  • vue--为什么data属性必须是一个函数
  • 翻译:Hystrix - How To Use
  • 看域名解析域名安全对SEO的影响
  • 聊聊redis的数据结构的应用
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 你真的知道 == 和 equals 的区别吗?
  • 盘点那些不知名却常用的 Git 操作
  • 深度学习在携程攻略社区的应用
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 消息队列系列二(IOT中消息队列的应用)
  • 小程序button引导用户授权
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • zabbix3.2监控linux磁盘IO
  • #QT(智能家居界面-界面切换)
  • #Z2294. 打印树的直径
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (26)4.7 字符函数和字符串函数
  • (Java)【深基9.例1】选举学生会
  • (poj1.2.1)1970(筛选法模拟)
  • (vue)页面文件上传获取:action地址
  • (第二周)效能测试
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)springboot优课在线教学系统 毕业设计 081251