面试题45:把数组排成最小的数字

输入一个正整数数组,把数组里所有的数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。这里自定义了一个排序规则。

class Solution {
public:
static int MyCompare(const string& s1,const string& s2){return s1+s2<s2+s1;
}string minNumber(vector<int>& nums) {int n=nums.size();string ret;if(n==0) return ret;vector<string> strnums;for(auto i:nums){strnums.push_back(to_string(i));}sort(strnums.begin(),strnums.end(),MyCompare);for(auto i:strnums){ret+=i;}return ret;}
};

C的代码

#include<bits/stdc++.h>
using namespace std;
const int g_MaxNumberLength=10;char* g_strCombine1=new char[g_MaxNumberLength*2+1];
char* g_strCombine2=new char[g_MaxNumberLength*2+1];
int compare(const void* strNumber1, const void* strNumber2);
void PrintMinNumber(int *numbers,int length){if(numbers==nullptr||length<=0){return;}char** strNumbers=(char**) (new int[length]);for(int i=0;i<length;++i){strNumbers[i]=new char[g_MaxNumberLength+1];sprintf(strNumbers[i],"%d",numbers[i]);}qsort(strNumbers,length,sizeof(char*),compare);for(int i=0;i<length;++i){printf("%s",strNumbers[i]);}printf("\n");for(int i=0;i<length;++i){delete[] strNumbers[i];}delete[] strNumbers;
}
int compare(const void* strNumber1, const void* strNumber2){strcpy(g_strCombine1,*(const char**)strNumber1);strcat(g_strCombine1,*(const char**)strNumber2);strcpy(g_strCombine2,*(const char**)strNumber2);strcat(g_strCombine2,*(const char**)strNumber1);return strcmp(g_strCombine1,g_strCombine2);
}
int main(void)
{int a[5]={3,30,34,5,9};PrintMinNumber(a,5);return 0;
}

2021年7月24日,还是要好好写笔记,好一阵没有认真做笔记记录了,有时候看看博客感觉自己写的题其实也不那么少了,但是长进却不大。

2.力扣763题:Partitionlables

在网上看到的统计一个字符第一次和最后一次出现的位置的方法,最后一次的位置可以从后往前去算,加油加油,今天是学习的一天,下一周的周一到周四会在8:40到9点之间回家。

题目是这样的:字符串S由小写字母组成,我们要把这个字符串划分为尽可能多的片段,同一个字母最多出现在一个片段中,用的是贪心策略,思路是:需要统计出每个字符最后一次出现的位置,然后遍历该字符串

//统计某个字符第一次出现的位置
char* strchr(char *p,char a)
{int i;assert(p!=NULL);for(i=0;i<strlen(p);i++){if(p[i]==a)return p+i;}return 0;
}//统计某个字符第一次出现的位置
char* strrchr(char *p,char a)
{int i;char *ret=p;assert(p!=NULL);for(i=strlen(p)-1;i>0;i--){if(p[i]==a)return ret+i;}return 0;
}

反向迭代器:相比于正向迭代器只需要把begin和end换成rbegin和rend。关于unorder_map和map,我们希望可以是有序的(按照字母表索引的)可以使用map。不过这倒题目中,

直接使用下标操作存在一个危险的副作用:如果该键不在map容器中,那么下标操作会插入一个具有该键的新元素。但是大多数情况下,使用者并不想插入一个容器本不存在的key。

这道题目采取贪心策略,思路如下:

  • 先获得每个字母最后一次出现的下标位置,需要自建hashtable
  • 从左到右遍历字符串,遍历的同时维护当前片段的开始下标start和结束end
  • 对于每个访问到的字母c,end=max(end,endc)
  • 当访问到下标end时,当前片段访问结束,长度为end-start+1
  • 重复上述过程,直到遍历完字符串
    class Solution {
    public:vector<int> partitionLabels(string s) {int last[26];vector<int> res;for(int i=0;i<s.size();++i){last[s[i]-'a']=i;}int start=0, end=0;for(int i=0;i<s.size();++i){if(last[s[i]-'a']>end){end=last[s[i]-'a'];}//end=max(end,last[s[i-'a' ]if(i==end){res.push_back(end-start+1);start=end+1;}}return res;}
    };

    注意:不要忘记在while的分支里break

3.滑动窗口

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。

注意:

对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
如果 s 中存在这样的子串,我们保证它是唯一的答案。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-window-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

双指针主要用于遍历数组,两个指针指向不同的元素,从而协同完成任务。也可以延伸到多
个数组的多个指针。
若两个指针指向同一数组,遍历方向相同且不会相交,则也称为滑动窗口(两个指针包围的
区域即为当前的窗口),经常用于区间搜索。
若两个指针指向同一数组,但是遍历方向相反,则可以用来进行搜索,待搜索的数组往往是
排好序的。

一篇不错的题解:

注意这个最大的for循环是直到right超出了字符串s的范围

string s="ADOBECODEBANC";string t="ABC";vector<int> chars(128,0);vector<bool> flag(128,false);for(int i=0;i<t.size();++i){flag[t[i]]=true;chars[t[i]]++;}int cnt = 0, left = 0, min_l = 0, min_size = s.size() + 1;for(int right=0;right<s.size();++right){if(flag[s[right]]){//如果当前的字符是t中的字符,才有后面这一系列的//--chars[s[right]];//碰到T中的字符就进行减if(--chars[s[right]]>=0){++cnt;//找到了一个满足条件的字符;对于<0的结果不会去++cnt}cout<<"cnt="<<cnt<<endl;// 若目前滑动窗口已包含T中全部字符,// 则尝试将l右移, 在不影响结果的情况下获得最短子字符串while(cnt==t.size()){if(right-left+1<min_size){min_size=right-left+1;min_l=left;cout<<"临时的min_size="<<min_size<<endl;}if(flag[s[left]] && ++chars[s[left]]>0){//这里写的有问题???chars的这个条件判断出错//++chars[s[left]];  一定注意这个条件,--cnt;//之前忘了写的cout<<"--cnt="<<cnt<<endl;}++left;cout<<"left="<<left<<endl;}}}cout<<"min_l="<<min_l<<"  min_size="<<min_size<<endl;string res=min_size>s.size()? "":s.substr(min_l,min_size);
cout<<"res="<<res;return 0;

输出的结果:这道题目要好好总结

680.验证回文串II

此题不一样的是可以删除一个字符,这是一个变化点, 这是我第二次做的答案,执行用时好一些。注意flag的使用

class Solution {
public:bool validPalindrome(string s) {int i=0, j=s.size()-1;int flag=0, temp;while(i<j){if(s[i]==s[j]){++i;--j;} else{flag++;break;}    }int start, end;start=i;end=j;if(flag==1){start++;while(start<end){if(s[start]==s[end]){++start;--end;}else{cout<<"--"<<endl;flag++;break;}}}if(flag==2){start=i;end=j;--end;while(start<end){if(s[start]==s[end]){++start;--end;}else{flag++;break;}}}cout<<flag<<endl;if(flag==3){return false;}else{return true;}}
};

把数组排成最小的数字,划分字母区间,最小覆盖子串,验证回文字符串II相关推荐

  1. 剑指offer T45 把数组排成最小的数字

    思想: 题目要求求一个由nums[]中所有元素拼接后组成的数最小的那个序列,然后又要求返回一个String,所以可以先将nums[]中各元素string化,得到一个String[],然后按某种顺序去拼 ...

  2. 【剑指offer-Java版】33把数组排成最小的数

    把数组排成最小的数 难点在于比较规则的确定以及比较规则的正确性证明 比如:仅仅是局部的两个数字的顺序较小,如何保证整个数组按此规则进行排序后达到全局的较小 书中关于这一点的证明直接用的反证法,忘的差不 ...

  3. 33:把数组排成最小的数

    /*** 面试题33:把数组排成最小的数* 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.* 例如输入数组{3,32,321},则打印出这三个数字能排成的 ...

  4. 《剑指offer》-- 把数组排成最小的数、丑数、二进制中1的个数、表示数值的字符串、替换空格

    一.把数组排成最小的数: 1.题目: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为 ...

  5. 算法:把数组排成最小的数

    * @Description 把数组排成最小的数* @问题:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.* 例如输入数组{3,32,321},则打印出这 ...

  6. 数据结构与算法--将数组排成最小的数

    将数组排成最小的数 题目:输入一个正整数的数组,将数组中所有数字拼接在一起排列成一个新的数,打印能拼接出来的所有数字中最小的一个, 案例:输入数组{12,4,55},则能打印出最小的数组是:12455 ...

  7. printf打印数组_(45)C++面试之把数组排成最小的数

    // 面试题45:把数组排成最小的数 // 题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼 // 接出的所有数字中最小的一个.例如输入数组{3, 32, 321},则打印出这3 ...

  8. 列表转化成数组_30. 把数组排成最小的数

    把数组排成最小的数 题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为3213 ...

  9. 软件的基本是要处理好”算法“及其基础(一)流-字-字符(包括某个数字、字母、符号和某个汉字等)-字符串-字节动态数组-字节-整数之间的转化关系和算法

    目录 软件的基本是要处理好"算法"及其基础(一): 流->计算机字->字符(包括某个数字.字母.符号和某个汉字等)->字符串->字节动态数组->字节- ...

最新文章

  1. 关于mongodb ,redis,memcache之间见不乱理还乱的关系和作用
  2. linux识别新加存储盘,Linux下新加磁盘
  3. 2018-2019-1 20165202 20165210 20165214 实验一 开发环境的熟悉
  4. 软件项目组织管理(七)项目成本管理
  5. msgpack java lua_使用lua-cmsgpack序列化和反序列化lua对象
  6. JavaEE实战班第13天
  7. GNU make manual 翻译(三十)
  8. Android 四大组件学习之ContentProvider二
  9. java中queue与stroke,ae中stroke的用法
  10. 视频教程-2020年软考网络规划设计师论文写作历年真题详解软考视频教程-软考
  11. windows下常见php集成环境安装包介绍(updated)
  12. 算法设计技巧与分析 答案整理
  13. 阿里云邮箱企业版产品知识库
  14. 基本系统调用性能lmbench测试方法和下载
  15. 视觉技术中的图像采集卡
  16. CollapsingToolbarLayout源码分析
  17. HDU 6194 后缀数组+单调栈
  18. Android笔记:浅析Android电视APP开发
  19. usr/bin/ld: i386 architecture of input file XXX.a( xxx.o) is incompatible with i386:x86-64
  20. python爬虫,记录爬取全球所有国家-首都的简单爬虫

热门文章

  1. uniapp栅格事件委托
  2. DPDK 交叉编译基本流程
  3. 【学会了学会了】Flink官网翻译——Standalone以及YARN部署
  4. 大数据帮助你提高销售业绩的4种方式
  5. 销售管理系统如何提升企业销售业绩?
  6. 天气json解析_彩云天气 API
  7. Neuro-X,神经学x建筑学、营销学、电影……
  8. 安装MySQL时出现no compatible servers were found的解决方法
  9. 基于WSP/WTP的MMS传输(5)——WSP 协议的实现
  10. 虚拟机linux清理空间,虚拟机占用物理磁盘空间不断增大,怎么清理?