算法通过村第十二关-字符串|白银笔记|经典面试题
文章目录
- 前言
- 1. 反转问题
- 1.1 反转字符串
- 1.2 k个一组反转
- 1.3 仅仅反转字母
- 1.3.1 采用栈实现操作
- 1.3.2 采用双指针实现操作
- 1.4 反转字符串里面的单词
- 1.4.1 使用语言提供的方法来解决(内置API)
- 1.4.2 如何优雅自己实现上述功能
- 2. 验证回文串
- 3. 字符串中的第一个唯一字符
- 4. 判断是否互为字符重排
- 4.1 排序重组
- 4.2 采用Hash实现操作
- 总结
前言
提示:越是在意的人,越是绝口不提。我选择你,做内心深处的秘密。来日有人剖开这颗心来,里面除了你,什么都没有。 --陶立夏《生活的比喻》
本章挑战的难度不大,是大量字符串题目的基础。务必学扎实。
1. 反转问题
我们知道反转是链表的一个重要考点,反转同样也是字符串的一个重要问题。常见的也就是如下这些:
推荐题目⭐⭐⭐⭐⭐:
344. 反转字符串 - 力扣(LeetCode)
541. 反转字符串 II - 力扣(LeetCode)
917. 仅仅反转字母 - 力扣(LeetCode)
151. 反转字符串中的单词 - 力扣(LeetCode)
557. 反转字符串中的单词 III - 力扣(LeetCode)
这些题目你是否看出一些规律在其中,要么反转字符串,要么反转里面的单词。针对字符的反转可以变换造出很多题目来。这里我们据从基本出发,逐个击破。
1.1 反转字符串
参考题目介绍:344. 反转字符串 - 力扣(LeetCode)
这是最基本的反转题,也是最简单的问题。这里使用双指针最直接。具体的做法是:
对于一个长度为N的待反转的字符串数组,我们观察反转前后的下标的变化,就可以知道结果
s[0] s[N - 1]
s[1] s[N - 2]
s[2] s[N - 3]
s[3] s[N - 4]
s[4] s[N - 5]
... ...s[n - 1] s[0]
比较完之后我们可以发现规律:即s[i] 与 s[N - 1 -i] 发生了交换。所以双指针我们就可以这样写:
- 将left指向字符串数组的首元素,right指向字符串数组的尾元素
- 当left < right:
- 交换s[left] 和 s[right]
- left 指针右移一位,即left = left + 1
- right指针左移一位,即right = tight -1
- 当left >= right ,反转结束,返回字符数组即可
/*** 反转字符串(双指针)* @param s the string */public static void reverseString(char[] s) {int n = s.length;for(int left = 0,right = n - 1; left < right; left++,right--){char c = s[left];s[left] = s[right];s[right] = c;}}
1.2 k个一组反转
参考题目介绍:541. 反转字符串 II - 力扣(LeetCode)
怎么感觉这题在找事呢?确实是闲了。这里我们根据题意直接模拟结果:
反转每个下标从2k的倍数开始,长度为k的字串。如果字串长度不足k则反转整个字串。
/*** 反转k个字符串* @param s* @param k* @return*/public static String reverseStr(String s, int k) {if(s == null || s.length=0){return new String();}int n = s.length();char[] chars = s.toCharArray();for(int i = 0; i < n; i += 2*k){reverse(chars,i,Math.min(k + i,n) -1);}return new String(chars);}public static void reverse(char[] arr, int left, int right) {while(left < right){char c = arr[left];arr[left] = arr[right];arr[right] = c;left++;right--;}}
1.3 仅仅反转字母
参考题目介绍:917. 仅仅反转字母 - 力扣(LeetCode)
这里第一眼的感觉是不是很复杂,但同样从两头向中间就可以了,但是问题‘-’不是均匀的有些麻烦,处理起来不容易就增加了难度。其实换一种思路就不同了,栈这个工具,对于反转来说非常好用。
1.3.1 采用栈实现操作
具体方法:
将s中的所有字母单独存放在栈中,所以出栈来说就是反序操作了(当然也可以用数组存并反序的)
然后遍历s的所有字符,如果是字母就输出。
/*** 仅仅反转字母* @param s the string to reverse* @return*/public static String reverseOnlyLetters(String s) {// 校验参数if (s == null || s.length() == 0) {return s;}// 创建一个栈作存储单词Stack<Character> letters = new Stack<Character>();for (Character c : s.toCharArray()){if (Character.isLetter(c)){letters.push(c);}}StringBuilder res = new StringBuilder();for (Character c : s.toCharArray()){if (Character.isLetter(c)){res.append(letters.pop());}else{res.append(c);}}return res.toString();}
1.3.2 采用双指针实现操作
一个接一个输出s的所有字符,当遇到一个字母时,我们希望找到逆序遍历字符串的下一个字母。
所以我们这么做:维护一个指针j从后向前遍历字符串,当需要字母的时候就使用它。
/*** 进反转字母(双指针实现)* @param s the string to reverse* @return*/public static String reverseOnlyLetters2(String s) {// 校验参数if (s == null || s.length() == 0) {return s;}StringBuilder res = new StringBuilder();int j = s.length() - 1;for(int i = 0; i < s.length(); i++) {if (Character.isLetter(s.charAt(i))){// 可能不止一个while(!Character.isLetter(s.charAt(j))){j--;}res.append(s.charAt(j--));}else{res.append(s.charAt(i));}}return res.toString();}
1.4 反转字符串里面的单词
参考题目介绍:151. 反转字符串中的单词 - 力扣(LeetCode)
这个题目经常在很多面试题中见到,这样的题目重点在如何处理单词,其实难度并不大,我们重点看下分析:
1.4.1 使用语言提供的方法来解决(内置API)
比如Java,Python,C++等很多语言提供了相关的特性,因此我们可以首先使用语言的特性来解决:
很多语言对字符串都有特殊的处理,提供了split(拆分),reverse(反转) 和 join(连续)等方法。一次采用内置的API是可行的。
- 使用split将字符串按照空格分割成字符串数组;
- 使用reverse将字符串数组进行反转;
- 使用join方法将字符串重新拼接成一个字符串。
如图:
public String reverseWords(String s) {if(s == null || s.length() == 0){return s;}// 去除开头和结尾的空白字符,这个很重要s = s.trim();// 正则匹配连续的字符空白字符作为分隔符// 正则表达式中\s匹配任何空白字符,包括空格、制表符、换页符等等, 等价于[ \f\n\r\t\v]List<String> wordList = Arrays.asList(s.split("\\s+"));Collections.reverse(wordList);return String.join(" ",wordList);
}
上面的方法,在面试中式禁止使用的,别想了,怎么会这么优雅呢,还是乖乖自己实现吧。
1.4.2 如何优雅自己实现上述功能
对于字符串可变的语言,就不需要在额外开辟空间了,直接在字符串上原地实现,这种情况下,反转字符和去除空格可以一起完成。
/*** 反转字符串中的单词* @param s* @return*/public static String reverseWords(String s) {// 校验参数if(s == null || s.length() == 0) {return s;}// 出去多余空白字符StringBuilder sb = trimSpaces(s);// 反转字符串reverse(sb,0,sb.length() - 1);// 反转每个单词reverseWord(sb);return sb.toString();}private static void reverseWord(StringBuilder sb) {int n = sb.length();int start = 0, end = 0;while(start < n){// 循环到单词末尾while(end < n && sb.charAt(end) != ' '){++end;}// 反转单词reverse(sb,start,end - 1);// 更新start, 去寻找下一个单词start = end + 1;++end;}}/*** 反转字符出(可变)* @param sb* @param left* @param right*/private static void reverse(StringBuilder sb, int left, int right) {while (left < right){char temp = sb.charAt(left);sb.setCharAt(left++,sb.charAt(right));sb.setCharAt(right--,temp);}}private static StringBuilder trimSpaces(String s) {int left = 0,right = s.length() - 1;// 去除掉开头和结尾的空白字符while (left <= right && s.charAt(left) == ' ') {left++;}while (left <= right && s.charAt(right) == ' ') {right--;}// 将字符串间多余的空白符去掉StringBuilder sb = new StringBuilder();while(left <= right){char c = s.charAt(left);if (c != ' '){sb.append(c);}else if (sb.charAt(sb.length() - 1) != ' '){sb.append(c);}left++;}return sb;}
2. 验证回文串
参考题目地址:125. 验证回文串 - 力扣(LeetCode)
回文问题再链表中也是常见的,再字符串中同样也是重点。(这里记录一下骨头哥☠️的经历技术面式:
第一就式写一个判断字符串回文的问题,题目本身很简单,双指针的典型问题。下面就会被加餐,找最长的回文串(这里就需要动态规划的思想了,这里我们后面再说))
说是话,刷了这么多题目,这个问题真的式手到擒来。有很多思路。最简单的方法就是对字符串进行一次遍历,并保留其中的字母和数字,放入另一个字符串sgood中。这样我们只需要判断sgood是不是一个普通的回文串了。
如果不是用语言的特性,这里我们可以使用双指针的思想来处理。
- 初始,左右指针分别指向sgood的两侧
- 不断向中间移动,判断是否相同,如果相遇就说明是回文串
/*** 判断是否为回文字符串* @param s* @return*/public static boolean isPalindrome(String s) {if (s == null || s.length() == 0) {return true;}StringBuilder sgood = new StringBuilder();int len = s.length();for(int i = 0; i < len; i++) {char c = s.charAt(i);if (Character.isLetterOrDigit(c)) {sgood.append(Character.isLowerCase(c));}}int n = sgood.length();int left = 0,right = n - 1;while(left < right) {if (Character.toLowerCase(sgood.charAt(left)) != Character.toLowerCase(sgood.charAt(right))) {return false;}++left;--right;}return true;}
3. 字符串中的第一个唯一字符
参考题目地址:387. 字符串中的第一个唯一字符 - 力扣(LeetCode)
对于这个问题,最直观的方法就是遍历两次就可以知道结果,采用hash统计字符串中每个字符出现的次数。在第二次遍历时,就可以遍历到只出现1次的字符,直接返回他的索引即可,没有的话返回-1。
/*** 找只出现一次的字符* @param s* @return*/public static int firstUniqChar(String s) {// 参数校验if(s == null || s.length() == 0){return 0;}Map<Character,Integer> frequency = new HashMap<Character,Integer>();for(int i = 0; i < s.length(); i++){char c = s.charAt(i);frequency.put(c,frequency.getOrDefault(c,0) + 1);}for(int i = 0; i < s.length(); i++){if (frequency.get(s.charAt(i)) == 1){return i;}}return -1;}
4. 判断是否互为字符重排
参考题目介绍:242. 有效的字母异位词 - 力扣(LeetCode)
这是一道简单题,就不要想的特别复杂啦。(当然这也是一道非常经典的题目)
这个题目来说,如果你觉得时排列组合的问题,还解决了,说明你排列组合学的很好。但是这里有更好的解法。
4.1 排序重组
将两个字符串全部从小到大或者从大到小排序,然后再逐个比较,不管原始字符串是什么,都可以判断出来,代码也不复杂。
/*** 判断字符串是否重排* @param s1* @param s2* @return*/public static boolean checkPermutation1(String s1, String s2) {// 将字符串转成数组char[] chars1 = s1.toCharArray();char[] chars2 = s2.toCharArray();// 排序Arrays.sort(chars1);Arrays.sort(chars2);// 比较return new String(chars1).equals(new String(chars2));}
这里需要注意我们使用了内置api,面试是不允许的。
4.2 采用Hash实现操作
注意:这里我们不能简单的判断是否已经存在,因为字符串可能在某个串里面重复存在例如“abac”。所以我们可以记录出现的次数,如果一个字符串经过重新排列后,能变成另外一个字符串,那么他们每个不同字符出现的次数是相同的。例如:出现此处不同的,那么便是两个字符串不能够经过重新排列得到。
所以写起来页不复杂,但是长了些。
/*** 判断字符串是否重排* @param s1* @param s2* @return*/public static boolean checkPermutation(String s1, String s2) {if(s1.length() != s2.length()){return false;}char[] chars = s1.toCharArray();Map<Character, Integer> s1Map = getMap(s1);Map<Character, Integer> s2Map = getMap(s2);for(Character c : chars){if(!s1Map.containsKey(c) || !s2Map.containsKey(c) || s1Map.get(c).intValue() != s2Map.get(c).intValue() ){return false;}}return true;}/*** 统计指定字符串str中各字符的出现次数,并以Map的形式返回* @param str* @return*/public static Map<Character, Integer> getMap(String str) {Map<Character, Integer> map = new HashMap<>();char[] chars = str.toCharArray();for (char aChar : chars) {map.put(aChar, map.getOrDefault(aChar, 0) + 1);}return map;}
总结
提示:字符串常见问题;双指针问题的回顾;反转问题;回文字符串;重排序问题。
如果有帮助到你,请给题解点个赞和收藏,让更多的人看到 ~ ("▔□▔)/
如有不理解的地方,欢迎你在评论区给我留言,我都会逐一回复 ~
也欢迎你 关注我 ,喜欢交朋友,喜欢一起探讨问题。
相关文章:
算法通过村第十二关-字符串|白银笔记|经典面试题
文章目录 前言1. 反转问题1.1 反转字符串1.2 k个一组反转1.3 仅仅反转字母1.3.1 采用栈实现操作1.3.2 采用双指针实现操作 1.4 反转字符串里面的单词1.4.1 使用语言提供的方法来解决(内置API)1.4.2 如何优雅自己实现上述功能 2. 验证回文串3. 字符串中的第一个唯一字符4. 判断是…...
《视觉 SLAM 十四讲》V2 第 5 讲 相机与图像
文章目录 相机 内参 && 外参5.1.2 畸变模型单目相机的成像过程5.1.3 双目相机模型5.1.4 RGB-D 相机模型 实践5.3.1 OpenCV 基础操作 【Code】OpenCV版本查看 5.3.2 图像去畸变 【Code】5.4.1 双目视觉 视差图 点云 【Code】5.4.2 RGB-D 点云 拼合成 地图【Code】 习题题…...
使用libmodbus库开发modbusTcp从站(支持多个主站连接)
使用libmodbus库开发modbusTcp从站(支持多个主站连接) Chapter1 使用libmodbus库开发modbusTcp从站(支持多个主站连接)rdsmodbusslave.hrdsmodbusslave.cppmain.cpp Chapter1 使用libmodbus库开发modbusTcp从站(支持多个主站连接) 参考链接:…...
GPT系列论文解读:GPT-2
GPT系列 GPT(Generative Pre-trained Transformer)是一系列基于Transformer架构的预训练语言模型,由OpenAI开发。以下是GPT系列的主要模型: GPT:GPT-1是于2018年发布的第一个版本,它使用了12个Transformer…...
(四)激光线扫描-光平面标定
在上一章节,已经实现了对激光线条的中心线提取,并且在最开始已经实现了对相机的标定,那么相机标定的作用是什么呢? 就是将图像二维点和空间三维点之间进行互相转换。 1. 什么是光平面 激光发射器投射出一条线,形成的一个扇形区域平面就是光平面,也叫光刀面,与物体相交…...
妙不可言的Python之旅----(二)
Python基础语法 什么是字面量 字面量:在代码中,被写下来的的固定的值,称之为字面量 常用的值类型 类型 描述 说明 数字(Number) 支持 • 整数(int) • 浮点数(floatÿ…...
cartographer(1)-运行
1.下载数据集 #1.下载数据集: mkdir /home/tang/bagfiles#2.开始二维建图 cd /home/tang/carto_ws/cartographer_detailed_comments_ws/install_isolated/source install_isolated/setup.bash rospack profile #新装的包索引地址存在ros的环境里 roslaunch ca…...
C++:模板进阶与继承
模板进阶与继承 模板进阶1.非类型的模板参数2.模板的特化2.1特化的概念2.2函数模板特化2.3类模板特化2.4全特化和偏特化2.4.1全特化2.4.2偏特化 3.模板的分离编译3.1同文件分离3.2不同文件下分离 继承1.继承的概念和定义1.1继承的概念1.2继承的定义1.2.1定义格式1.2.2继承关系和…...
vue-img-cutter 实现图片裁剪[vue 组件库]
借助 vue-img-cutter 可以在网页端实现图片裁剪功能,最终功能效果如下: 组件 npm 安装 npm install vue-img-cutter2 --save-dev # for vue2 npm install vue-img-cutter3 --save-dev # for vue3vue-img-cutter使用 template模板标签模块,…...
手把手教你从零开始腾讯云服务器部署(连接建站教程)
使用腾讯云服务器搭建网站全流程,包括轻量应用服务器和云服务器CVM建站教程,轻量可以使用应用镜像一键建站,云服务器CVM可以通过安装宝塔面板的方式来搭建网站,腾讯云服务器网txyfwq.com分享使用腾讯云服务器建站教程,…...
微信开放平台第三方开发,实现代小程序备案申请
大家好,我是小悟 微信小程序备案整体流程总共分为五个环节:备案信息填写、平台初审、工信部短信核验、通管局审核和备案成功。 服务商可以代小程序发起备案申请。在申请小程序备案之前,需要确保小程序基本信息已填写完成、小程序至少存在一个…...
设计模式——11. 享元模式
1. 说明 享元模式(Flyweight Pattern)是一种结构型设计模式,它旨在减少系统中相似对象的内存占用或计算开销,通过共享相同的对象来达到节省资源的目的。 享元模式的核心思想是将对象的状态分为内部状态(Intrinsic State)和外部状态(Extrinsic State): 内部状态是对象…...
【LLM】主流大模型体验(文心一言 科大讯飞 字节豆包 百川 阿里通义千问 商汤商量)
note 智谱AI体验百度文心一言体验科大讯飞大模型体验字节豆包百川智能大模型阿里通义千问商汤商量简要分析:仅从测试“老婆饼为啥没有老婆”这个问题的结果来看,chatglm分点作答有条理(但第三点略有逻辑问题);字节豆包…...
CSS小计
1:设置图片随窗缩放 使用百分比 width: 100%;height: 100%; 使用vmin: 将可视区域分为100vmin width: 100vmin;height: 100vmin; 2:设置字体颜色与背景色融合 mix-blend-mode: difference 3: 设置宽度自适应 width:fit-content 4:外边距合并 当两个相领的两个容…...
机器学习:决策树
决策树 决策树是一种基于树形结构的模型,决策树从根节点开始,一步步走到叶子节点(决策),所有的数据最终都会落到叶子节点,既可以做分类也可以做回归。 特征选择 根节点的选择该用哪一个特征呢ÿ…...
xxl-job的原理(2)—调度中心管理注册信息
一、调度中心管理注册信息 1.JobApiController 执行器调用调度中心的url来实现注册、下线、回调等操作;其主要的实现类是JobApiController,调用/api/registry接口注册执行器信息,调用/api/registryRemove接口下线执行器信息,调用…...
小白入门pytorch(二)----神经网络
本文为🔗[小白入门Pytorch]学习记录博客 文章目录 前言一、神经网络的组成部分1.神经元2.神经网络层3.损失函数4.优化器 二、Pytorch构建神经网络中的网络层全连接层2.卷积层3.池化层4.循环神经网络5.转置卷积层6.归一化层7.激活函数层 三、数据加载与预处理1.数据加…...
【进阶C语言】排序函数(qsort)与模拟实现(回调函数的实例)
本章大致内容目录: 1.认识回调函数 2.排序函数qsort 3.模拟实现qsort 回调函数为C语言重要知识点,以函数指针为主要知识;下面介绍回调函数的定义、回调函数的库函数举例即库函数模拟实现。 一、回调函数 1.回调函数定义 回调函数就是一…...
CentOS 7 上编译和安装 SQLite 3.9.0
文章目录 可能报错分析详细安装过程 可能报错分析 报错如下: django.core.exceptions.ImproperlyConfigured: SQLite 3.9.0 or later is required (found 3.7.17). 原因:版本为3.7.太低了,需要升级到3.9.0至少 详细安装过程 1.安装所需的…...
[GXYCTF2019]禁止套娃 无回显 RCE 过滤__FILE__ dirname等
扫除git 通过githack 获取index.php <?php include "flag.php"; echo "flag在哪里呢?<br>"; if(isset($_GET[exp])){if (!preg_match(/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i, $_GET[exp])) {if(; preg_replace(/[a-z,_]\(…...
Springboot使用Aop保存接口请求日志到mysql
1、添加aop依赖 <!-- aop日志 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency> 2、新建接口保存数据库的实体类RequestLog.java package com.example…...
网络安全面试题汇总(附答案)
作为从业多年的网络安全工程师,我深知在面试过程中面试官所关注的重点及考察的技能点。网络安全作为当前信息技术领域中非常重要的一部分,对于每一个从事网络安全工作的人员来说,不仅需要掌握一定的技术能力,更需要具备全面的综合…...
Centos7安装kvm,配置虚拟机网络
1.安装软件包,禁用防火墙(非必须) yum -y install qemu-kvm libvirt virt-install 1)禁用防火墙(非必须) systemctl stop firewalld systemctl disable firewalld 2)禁用NetworkManager syst…...
Javascript文件上传
什么是文件上传 文件上传包含两部分, 一部分是选择文件,包含所有相关的界面交互。一部分是网络传输,通过一个网络请求,将文件的数据携带过去,传递到服务器中,剩下的,在服务器中如何存储…...
golang gin——文件上传(单文件,多文件)
文件上传 单文件上传 从form-data获取文件 package uploadimport ("github.com/gin-gonic/gin""net/http" ) // 单文件上传,多文件上传 func Upload(c *gin.Context) {file, _ : c.FormFile("file") // file为字段名dst : "…...
面试题:Redis和MySQL的事务区别是什么?
大家好,我是小米!今天我要和大家聊聊一个在技术面试中经常被问到的问题:“Redis和MySQL的事务区别是什么?”这个问题看似简单,但实际上涉及到了数据库和缓存两个不同领域的知识,让我们一起来深入了解一下吧…...
Canvas绘图
Canvas绘图 Canvas的意义 随着前端的不断发展,页面特效越来越炫酷,W3C组织也不断退出新的CSS特性:例如各种渐变,瀑布流布局,各种阴影,但是随着需求越来越花哨,W3C表示:我去你妈的&…...
逻辑回归评分卡
文章目录 一、基础知识点(1)逻辑回归表达式(2)sigmoid函数的导数损失函数(Cross-entropy, 交叉熵损失函数)交叉熵求导准确率计算评估指标 二、导入库和数据集导入库读取数据 三、分析与训练四、模型评价ROC曲线KS值再做特征筛选生成报告 五、行为评分卡模型表现总结 一、基础知…...
DPDK系列之三十三DPDK并行机制的底层支持
一、背景介绍 在前面介绍了DPDK中的上层对并行的支持,特别是对多核的支持。但是,大家都知道,再怎么好的设计和架构,再优秀的编码,最终都要落到硬件和固件对整个上层应用的支持。单纯的硬件好处理,一个核不…...
LVGL_基础控件滚轮roller
LVGL_基础控件滚轮roller 1、创建滚轮roller控件 /* 创建一个 lv_roller 部件(对象) */ lv_obj_t * roller lv_roller_create(lv_scr_act()); // 创建一个 lv_roller 部件(对象),他的父对象是活动屏幕对象// 将部件(对象)添加到组,如果设置了默认组,…...
白之家 低成本做网站/外贸接单平台网站
1.1 Adb介绍 adb(android debug bridge)是android sdk自带的一个工具 Adb是用来连接android设备和PC端的桥梁,通过adb工具,用户可以在PC端对手机进行全面的操作 Android的初衷是用adb这样的一个工具来协助开发人员在开发android应用的过程中更快更好的调…...
做我女朋友的套路网站/百度电话号码
在现在电商迅速占领市场的时代里,选择开发商城系统已经成为了一种趋势,现在开发搭建商城系统有很多编程语言可以选择,目前在电商里市面上受到很多商家企业的喜爱的便是Java商城系统,大家纷纷选择Java的商城系统,那为什…...
wordpress禁止谷歌字体大小/热点事件
图形界面是用户对我们应用的第一印象,因此有一个良好的UI界面是非常之关键,可很好的引导用户满足他们的期望。好的UI风格必须一致,才能让网站和应用容易被理解和使用。 本文收集了30最好的免费用户界面包: Retro UI Kit by Liam W…...
设计师网上接单的网站/百度服务中心官网
java.util.regex 包主要包括以下三个类:Pattern 类:pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个…...
本机做网站服务上传到/站长工具日本
项目有需求,要求检测飞行模式,如果是飞行模式提醒用户修改状态... qq.png uc.png wx.png wy.png wyy.png 这些图片是我其他app所做出的提醒,毕竟苹果提供给开发者可用的状态太少了 typedef enum : NSInteger {NotReachable 0,ReachableViaWi…...
企业管理系统需求分析/优化大师下载旧版本安装
很高兴阿森纳能在欧冠上战胜拜仁,在虎扑上看到这样的一句话,颇有感触,借来作为这篇博文的开始,生活中我们需要一些勇气去追寻自己的理想。回到本篇内容上,对偶是个神奇的东西,从文学角度而言,对…...