精华内容
下载资源
问答
  • 在三个字符串中找出最小的

    千次阅读 2019-05-23 21:17:09
    /*在三个字符串中找出最小的*/ #include<stdio.h> #include<stdlib.h> #include<string.h> #define N 20 #define M 3 void main() { char s[N],str[M][N]; int i; for(i=0;i<M;i++) { ...
    /*在三个字符串中找出最小的*/
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #define N 20
    #define M 3
    void main()
    {
    	char s[N],str[M][N];
    	int i;
    	for(i=0;i<M;i++)
    	{
    		gets(str[i]);	
    	}	
    	strcpy(s,(strcmp(str[0],str[1])<0)?str[0]:str[1]);
    	if(strcmp(str[2],s)<0)
    	{
    		strcpy(s,str[2]);
    	}
    	printf("最小的字符串为:%s\n",s); 
    }
    

    运行结果:
    在这里插入图片描述
    注明:不清楚字符串大小比较规则的欢迎留言我,我会专门出一篇哦!

    展开全文
  • #include #include int main() {  char s[20],str[3][20];  int i; for(i=0;i  gets(str[i]); strcpy(s,填空); if(strcmp(str[2],s) strcpy(s,str[2]); printf("%s\n",填空);...}
    #include<stdio.h>
    #include<string.h>
    int main()
    {
        char s[20],str[3][20];
        int i;
    for(i=0;i<3;i++)
      gets(str[i]);
    strcpy(s,填空);
    if(strcmp(str[2],s)<0)
    strcpy(s,str[2]);
    printf("%s\n",填空);
    }
    展开全文
  • 欢迎来到算法小课堂,今天分享的内容是滑动窗口数组的应用。分享的题目是LeetCode的:209....01LeetCode#209长度最小的子数组题目描述:给定一含有 n 正整数的数组和一正整数 s ,找出该数组满足其和...
    欢迎来到算法小课堂,今天分享的内容是滑动窗口在数组中的应用。分享的题目是LeetCode中的:
    • 209.长度最小的子数组 难度 中等
    • 438.找到字符串中所有字母异位词 难度 中等
    • 76.最小覆盖子串 难度 困难
    接下来,逐一看下如何用滑动窗口的思想来解答这三道题目。01LeetCode #209 长度最小的子数组题目描述:给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。示例:输入:s = 7, nums = [2,3,1,2,4,3]输出:2解释:子数组 [4,3] 是该条件下的长度最小的子数组。
    思路分析:对于该题目可以用暴力解法来解决,使用双重for循环,第一重for循环遍历整个数组,用于标定起始考察元素。然后在开始第二重for循环之前,定义变量sum,用于表示所考察元素的总和。在第二重for循环里,先计算总和,然后和正整数s比较,如果大于等于正整数s,则记录当前考察过的元素之间的长度。详细代码如下:
    public int minSubArrayLen(int s, int[] nums) {    // 初始化子数组长度为数组长度+1    int result = nums.length + 1;    for(int i = 0; i < nums.length; i++) {        int sum = 0;        for(int j = i; j < nums.length; j++) {            sum += nums[j];            // 如果当前累加和大于正整数s,则更新子数组长度            if (sum >= s) {                result = Math.min(result, j - i + 1);            }        }    }    // 如果最终result的值等于数组长度+1,则表示不存在符合条件的子数组    return result == nums.length + 1 ? 0 : result;}
    接下来看下如何用滑动窗口的思想来解决该题目。首先,明确几个变量的定义,变量start表示窗口的起始位置,变量end表示窗口的结束位置,区间[start,end]用于记录当前窗口中的元素,变量sum表示窗口中所有元素的总和,变量result表示符合题意的子数组长度。需要注意的是在这里,滑动窗口的起始位置start=0,结束位置end=-1,表示,初始状态下窗口中没有元素,因为区间[0,-1]并不存在。result的初始值给定数组长度加1。4f13b17269bf613fcfe2426bc2d4656b.png接着,先扩大滑动窗口的右侧边界,即指针end向右移动一个位置。这时窗口区间为[0,0],窗口内的元素是2,即sum=2。e5ebb6cf8c255b660069694772ccd92e.png由于sum=2小于目标值s=7,因此需要继续扩大窗口右侧边界,即指针end继续向右移动一个位置。这时,窗口区间为[0,1],窗口内元素是2,3,即sum=5。f5a45b5413fea377f1e848fd5b2b83d5.png这时,由于sum=5依旧小于目标值s=7,因此需要继续扩大窗口右侧边界。也就是说,对于该题目,只要窗口区间[start,end]内元素总和小于目标值s=7,就需要继续扩大窗口右边界,来使sum变大。如下图,当指针end指向索引3的位置时,窗口区间[0,3]内的元素2、3、1、2总和为8大于目标值s=7,因此需要更新result的值为4。c34db2b7dd4a748934ebd235797bae7b.png这时,请思考一个问题:窗口的右侧边界还有必要继续向右扩大吗?答案是没有必要。因为,此时窗口内的元素总和已经大于等于目标值s=7,也就是已经找到一个连续的子数组{2,3,1,2}使得其和大于等目标值s=7了。如果继续向右扩大窗口右侧边界,只能是让窗口区间内的元素总和继续增大,伴随着的就是连续子数组的长度也在增大,而题目要求的是长度最小的连续子数组,因此,当窗口内所有元素的总和大于等目标值s=7时,就需要停止继续扩大窗口右侧边界这一动作。这一点其实正是上面提到的暴力解法双重for循环的不足之处,即双重for循环会存在冗余的计算。如下图,最后两次计算,即j=4和j=5,在i=0时,是没必要参与计算的。2dc944c97b0cf6c93a38b69a78fc1ef2.png双重for循环,当i=0时,计算效果示意图当窗口右侧边界不能扩大时,接着要做的就是缩小窗口的左侧边界,来看缩小左侧边界之后,窗口内的元素总和是否依旧大于等于目标值s=7,如果是,则继续缩小窗口左侧边界,如果不是则扩大窗口右侧边界,直到数组末尾。动画演示代码实现
    public int minSubArrayLen(int s, int[] nums) {    if (nums.length == 0) {        return 0;    }    // window [start...end]    int start = 0;    int end = -1;    int sum = 0;    int result = nums.length + 1;    while (start < nums.length) {        // 还有剩余元素未考察并且窗口内元素总和小于目标值s        if (end + 1 < nums.length && sum < s) {            end++;            sum += nums[end];        } else { // 尝试缩小窗口            sum -= nums[start];            start++;        }        // 窗口内元素总和大于等于目标值s则更新结果值        if (sum >= s) {            result = Math.min(result, end - start + 1);        }    }    return result == nums.length + 1 ? 0 : result;}
    02LeetCode #438 找到字符串中所有字母异位词题目描述:给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。说明
    • 字母异位词指字母相同,但排列不同的字符串。

    • 不考虑答案输出的顺序。

    示例:输入: s: "cbaebabacd" p: "abc"输出: [0, 6]解释:起始索引等于 0 的子串是 "cba", 它是 "abc" 的字母异位词。起始索引等于 6 的子串是 "bac", 它是 "abc" 的字母异位词。
    思路分析:该题目用滑动窗口思想解决的基本思路是:首先,计算字符串p中各个元素出现的次数,由于字符串只包含小写英文字母,所以可以用数组来记录每个元素出的次数。接着,用变量start表示窗口的起始位置,变量end表示窗口的结束位置,区间[start,end]用于记录当前窗口中的元素。在这里扩大窗口右侧边界的条件是——字符串s还有剩余元素为考察且窗口[start,end]内的字符长度小于字符串p的长度;缩小窗口左侧边界的条件是——窗口[start,end]内字符的长度等于字符串p的长度。当,窗口[start,end]内字符的长度等于字符串p的长度时,接着要做的就是判断窗口内的字符串是不是字符串p的字母异位词(每个字母出现次数相同,只是顺序不同)。具体逻辑可看如下动画演示或代码实现。动画演示代码实现
    public ListfindAnagrams(String s, String p) {    List resultList = new ArrayList<>();    // 计算字符串p中各元素的出现次数    int[] pFreq = new int[26];    for(int i = 0; i < p.length(); i++) {        pFreq[p.charAt(i)-'a']++;    }    // 窗口区间为[start,end]    int start = 0, end = -1;    while (start         // 还有剩余元素未考察,且窗口内字符串长度小于字符串p的长度        // 则扩大窗口右侧边界        if (end+1 < s.length() && end-start+1             end++;        }else {            // 右侧边界不能继续扩大或窗口内字符串长度等于字符串p的长度            // 则缩小左侧边界            start++;        }        // 当窗口内字符串长度等于字符串p的长度时,则判断其是不是字符串p的字母异位词子串        if (end-start+1 == p.length() && isAnagrams(s.substring(start,end+1), pFreq)) {            resultList.add(start);        }    }    return resultList;}// 判断当前子串是不是字符串p的字母异位词private boolean isAnagrams(String window, int[] pFreq) {    // 计算窗口内字符串各元素的出现次数    int[] windowFreq = new int[26];    for(int i = 0; i < window.length(); i++) {        windowFreq[window.charAt(i)-'a']++;    }    // 比较窗口内各元素的出现次数和字符串p中各元素的出现次数是否一样    // 如果都一样,则说明窗口内的字符串是字符串p的字母异位词子串    // 如果不一样,则说明不是其子串    for(int j = 0; j < 26; j++) {        if (windowFreq[j] != pFreq[j]) {            return false;        }    }    return true;}
    03LeetCode #76最小覆盖子串题目描述:给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。注意:如果 s 中存在这样的子串,我们保证它是唯一的答案。示例:输入:s = "ADOBECODEBANC", t = "ABC"输出:"BANC"
    思路分析:最小覆盖子串是这样的子串,不仅字符串t中的每个字符都在该子串中出现,同时该子串中那些和字符串t中字符一样的字符其出现次数要大于等于其在字符串t中出现的次数。该题目用滑动窗口思想来解决的整体思路是:首先,统计字符串t中每个字符的出现次数。然后,扩大窗口右侧边界,直到窗口内的字符串包含了字符串t中的每个字符,同时字符串t中的每个字符在窗口内的字符串中的出现次数要大于等于字符串t中每个字符的出现次数。接着,尝试缩小窗口的左侧边界,看窗口内字符串能不能覆盖字符串t。这里为了方便讲解,我们以字符串s=“BCEBA"和字符串t=”ABC"为例来看一下滑动窗口的具体实现过程。同样的,用变量start表示窗口的起始位置,变量end表示窗口的结束位置,区间[start,end]用于记录当前窗口中的字符。其余定义如下图:

    6ad240ae58d87ae29e842b05ce3d9fab.png

    首先,向右移动指针end来扩大窗口右边界。在扩大窗口边界后,窗口内字符B的出现次数更新为1,同时该字符在字符串t中有出现,因此更新windowSameCount为1。

    eb65bf5b1be9b02cd98de7b0049f1938.png

    继续向右移动指针end来扩大窗口右边界,直到字符串t中的每个字符在窗口中都有出现,且窗口内和字符串t中的字符相同的字符A、B、C出现次数大于等于其本身在字符串t中的出现次数。如下图,窗口[0,4]内那些和字符串t中一样的字符A、B、C其出现次数分别为1、2、1。这时字符串"BCEBA"就是满足题意的一个子串。9ae584800cd3aba96658ad81ff6acd91.png接着,要做的就是移动指针start来缩小窗口左侧边界。看窗口内的字符串是否依旧可以覆盖字符串t="ABC"。如下图,当移动指针start缩小窗口左侧边界后,窗口[1,4]内的字符串依旧可以覆盖字符串t。因为字符串t中的字符A、B、C在窗口[0,4]内都有出现,且出现次数依次为1、1、1。dd7b3cc59a14e17d32ec43c90277186e.png由于指针end已经指向字符串s最后一个字符,因此接着要做的就是移动指针start来缩小窗口范围继续看窗口内的字符串是否可以覆盖字符串t。直到指针start也指向字符串s最后一个字符。动画演示代码实现
    public String minWindow(String s, String t) {    // 统计字符串t中每个字符的出现次数    int[] tFreq = new int[256];    for(int i = 0; i < t.length(); i++) {        tFreq[t.charAt(i)]++;    }    // 用于记录窗口中每个字符的出现次数    int[] windowFreq = new int[256];    // 当前窗口中和字符串t中的字符相同的字符个数    int windowSameCount = 0;    int minWindowLength = s.length()+1;    int startIndex = -1;    int start = 0;    int end = -1;    while (start < s.length()) {        if (end+1            windowFreq[s.charAt(end+1)]++;            // 窗口中当前考察的字符的出现次数小于等于字符串t中字符出现次数            // 则窗口中当前考察的字符是在字符串t中出现的            if (windowFreq[s.charAt(end+1)] <= tFreq[s.charAt(end+1)]) {                windowSameCount++;            }            end++;        }else {            // 字符串t中的字符在窗口中全部出现            if (windowSameCount == t.length() && end - start + 1 < minWindowLength) {                minWindowLength = end - start + 1;                startIndex = start;                System.out.println(s.substring(start,end+1));            }            // 窗口左移            windowFreq[s.charAt(start)]--;            if (windowFreq[s.charAt(start)] < tFreq[s.charAt(start)]) {                windowSameCount--;            }            start++;        }    }    if (startIndex != -1) {        return s.substring(startIndex, startIndex+minWindowLength);    }    return "";}

    今天的分享就到这里了感谢您的阅读如有错误欢迎在公众号后台留言指出下一篇我们将学习新的内容,敬请期待
    题图:blende12 / Pixabay参考资料:https://github.com/liuyubobobo/Play-Leetcode/blob/master/0438-Find-All-Anagrams-in-a-String/cpp-0438/main.cpphttps://github.com/liuyubobobo/Play-Leetcode/blob/master/0076-Minimum-Window-Substring/cpp-0076/main.cpp
    展开全文
  • 字符串之间的距离

    2019-08-31 11:14:30
    题目描述: 做题的思路: 看到这道题,我们首先需要知道最短距离怎么...最后将二维数组之的数值进行比较,较小的放在第三个数组之,然后输出第三个数组,这样最小距离就出来了。 具体的实现代码如下: publi...

    题目描述:

    在这里插入图片描述
    做题的思路:
    看到这道题,我们首先需要知道最短距离怎么来进行计算,所谓最短距离不过就是下标相减,我们接下来自然是找出目标字母的索引,将目标字母的索引放置在一个数组之中,然后用目标函数的索引与其他字母的索引相减,然后最后差值保存在一个二维数组之中,最后在将二维数组之中的数值进行比较,较小的放在第三个数组之中,然后输出第三个数组,这样最小距离就出来了。
    具体的实现代码如下:

    	public static void main(String[] args) {
    		
    		Scanner sc = new Scanner(System.in);
    		String s = sc.next();
    		char ch = sc.next().charAt(0);
    		char[] c = s.toCharArray();
    		int[][] num1 = new int[s.length()][s.length()];
    		int[] num = new int[s.length()];
    		int[] num3 = new int[s.length() * 3];
    		int b = 0,d = 0,f = 0;
    		for(int i = 0 ; i < s.length(); i++) {
    			if(c[f++] == ch) {
    				num[b++] = i;
    			}else {
    				continue;
    			}
    		}
    		for(int i = 0; i < s.length(); i ++) {
    			if(num[i] != 0) {
    				d++;
    			}
    		}
    		
    		int a = 0;
    		for(int i = 0; i < d; i++) {
    			for(int j = 0; j < s.length() + 1; j++) {
    				if(j < s.length()) {
    					num1[i][j] = Math.abs(num[a] - j);
    				}else {
    					a++;
    					break;
    				}
    			}
    		}
    		for(int i = 0; i < d -1; i++) {
    			for(int j = 0; j < s.length();j++) {
    				if(num1[i][j] < num1[i+1][j] ) {
    					num3[j] = num1[i][j];
    				}else {
    					num3[j] = num1[i+1][j];
    				}
    			}
    		}
    		for(int i = 0; i < s.length();i++) {
    			System.out.print(num3[i]);
    		}
    	}
    

    这是我对这道题的理解,不喜勿喷!谢谢!

    展开全文
  • 1. 题目描述  输入一正整数数组,把数组里所有数字拼接起来...然后我想到了一方案,就是将数组的元素进行排列,分别将得到的所有数组链接成字符串找出最小的。但是这方案本地运行的时候正常,提交
  • 思路:每次从vector中找出最小的数,并将其erase,直到vector为空;找寻最小的数时,设计一比较函数checkmin(),先比较前面的部分,超出部分与较短字符串的首字符比较,即可得到比较结果,代码如下:...
  • 题目描述 输入一正整数数组,把数组里所有数字拼接起来排成一数,打印能拼接的所有数字...就先从左到右第一位是0的,没有就1,没有2,2只有一,则加入到字符串中。 从左到右第一位3开头的有3哥,...
  • 给你一个字符串 S、一个字符串 T,请字符串 S 里面找出:包含 T 所有字符的最小子串。 示例: 输入: S = “ADOBECODEBANC”, T = “ABC” 输出: “BANC” 说明: 如果 S 不存这样的子串,则返回空字符串 “”...
  • 最长公共子序列问题,最基本的问题是个字符串中找出最长公共字符串。方法是使用双指针 i,j遍历两个字符串,建立二维 dp 数组,通过填表获得结果。 1143,最长公共子序列,medium 583,两个字符串的删除操作,...
  • 2.15 给字符串中的变量名做插值处理 62 2.16 以固定的列数重新格式化文本 64 2.17 文本中处理HTML和XML实体 66 2.18 文本分词 67 2.19 编写一简单的递归下降解析器 70 2.20 字节串上执行文本操作 80 第3章 ...
  • 最新版 最新版 最新版 高清 高清 高清 包含三个版本 三个版本!!! 本书为超级畅销书《大话设计模式》作者程杰潜心三年推出的扛鼎之作!以一个计算机教师教学为场景,讲解数据结构和相关算法的知识。通篇以一种...
  • 8.8编写一函数,有实参传来一个字符串,统计此字符串中字母,数字,空格和其它字符的个数,主函数中输入字符串以及输出上述的结果。 52 8.10写一函数,用“起泡法”对输入的10个字符按由小到大的顺序排列。 54 ...
  • 5.13 STRING到STRING+99单元中存放着一个字符串,试编制一程序测试该字符串中是否存在数字,如有,则把CL的第五位置1,否则置0. 5.14 首地址为TABLE的数组中按递增次序存放着100H个16位补码数,试编写一个程序把...
  • 一段字符串,个字符串中仅包含’R’,‘B’,'G’三个字符(也就是三原色),修改该字符串使得它某个字符旁边以及旁边的旁边不能出现他自己,输出修改次数最小的方案和修改后的字符串 题目分析 一开始我是想用...
  • 将$和*之间所有的字符做^运算(第一个字符和第二个字符异或,结果再和第三个字符异或,依此类推)之后的值对65536取余后的结果,应该和*后面的两个十六进制数字的值相等,否则的话说明这条语句传输发生了错误。...
  • 5.7 KMP模式匹配算法 135 很多年前我们的科学家觉得像这种有多0和1重复字符的字符串,却需要挨个遍历的算法,是非常糟糕的事情。 5.7.1 KMP模式匹配算法原理 135 5.7.2 next数组值推导 139 5.7.3 KMP模式匹配算法...
  • MYSQL中文手册

    2013-03-11 21:21:34
    同一数据库创建多表的缺陷 7.5. 优化MySQL服务器 7.5.1. 系统因素和启动参数的调节 7.5.2. 调节服务器参数 7.5.3. 控制查询优化器的性能 7.5.4. 编译和链接怎样影响MySQL的速度 7.5.5. MySQL如何使用...
  • 2.编程实现:给定的字符串中查找满足条件的第一个字符。 3.编程实现:首先任意输入一个大于2且小于10的整数n,再输入一个由n决定的二维整型数组(n n),形成n n阶矩阵,将矩阵中最大元素所在的行和最小元素所在...
  • delphi 开发经验技巧宝典源码

    热门讨论 2010-08-12 16:47:23
    0050 如何在字符串中使用单引号 32 0051 结构对象的定义与使用 32 0052 使用数组为TlistView组件动态创建字段 33 0053 解决程序的死锁问题 34 0054 怎样实现接口委托 34 0055 Delphi中使用汇编 35 ...
  • 题目描述 ...思路:先将数组排序,找出能使三个数字排成最小数字的排序方式,若a+b<b+a,则a排b前面,反之则是b排a前面。然后将数字转化成字符串输出。 #include <iostream> #inc...
  • 将$和*之间所有的字符做^运算(第一个字符和第二个字符异或,结果再和第三个字符异或,依此类推)之后的值对65536取余后的结果,应该和*后面的两个十六进制数字的值相等,否则的话说明这条语句传输发生了错误。...
  • 找出最小的K数 测试30 第十一题 连续子数组的最大和 测试31 第十二题 从1到整数n1出现的次数 测试32 第题 把数组的数排成一最小的数 测试33 第十四题 求第N丑数 测试34 第十五题 ...
  • 找出最小下标2.旋转数组中找最小值3.旋转数组中查找一数4.查找一区间5.空字符串列表中找下标四、总结 一、二分搜索算法的原理 举简单的例子:大家肯定玩过猜数字的游戏,1-100之间选一数字,让另一人...
  • python字符串与绘图复习变量None变量参与运算没有赋值的情况不会改变绘制立方体绘制五角星时间计算强化实现贷款计算连续输入多个字符串加法与绘图实现显示线段长度数据函数使用快速查阅函数帮助字符串种风格字符与...
  • 同一数据库创建多表的缺陷 7.5. 优化MySQL服务器 7.5.1. 系统因素和启动参数的调节 7.5.2. 调节服务器参数 7.5.3. 控制查询优化器的性能 7.5.4. 编译和链接怎样影响MySQL的速度 7.5.5. MySQL如何使用内存 ...
  • 1.三角形最小路径和 给定一三角形,找出自顶向下的最小路径和。...给定一非空字符串s和一包含非空单词列表的字典wordDict,判定s是否可以被空格拆分为一或者多个在字典出现的单词。 拆分...
  • 前言除了基础知识以外,算法也是面试比较固定的一部分。因此也是这里梳理一些国内几大厂经常用到的算法,查漏补缺。一、实现一计算器(腾讯真题)二、实现atoi,字符串到...、无序数组,找出最小的k数...
  • ├─083 在字符串中找出连续最长数字串 ├─084 int数组分组,两组和相等 │ └─Source │ └─Debug ├─086 人民币转换 │ └─Source │ └─Debug ├─087 表示数字 ├─090 自动售货系统 │ └─Source │ └...
  •  JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要...
  • 加入的这函数的作用就是移除字符串开头和结尾的空白字符。 12.最后,如果输入错误了,重新回到登录对话框时,我们希望可以使用户名和 密码框清空并且光标自动跳转到用户名输入框,最终的登录按钮的单击事件的槽 ...

空空如也

空空如也

1 2 3 4
收藏数 78
精华内容 31
关键字:

在三个字符串中找出最小的