面试题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. Jupyter Notebook 基本使用
  2. 【剑指offer-Java版】47不用加减乘除做加法
  3. iis日志转到sql存储
  4. 各向异性扩散滤波_原理与算法
  5. flask返回json数据到前端_小白学Flask第六天| abort函数、自定义错误方法、视图函数的返回值...
  6. 注解源代码学习 - Annotation @InjectMocks and @Mock debug
  7. 二叉排序树的删除+图解
  8. mac/windows 端口占用解决记录
  9. 生成word_Word如何生成目录?3个步骤轻松掌握!
  10. shell脚本中if流程控制语句的应用
  11. C语言练习——判断位数
  12. linux tar解压bin文件,linux下 tar解压 gz解压 bz2等各种解压文件使用方法
  13. 手工笔筒制作教程(附彩色贴图分享)
  14. 台式电脑怎么组装步骤_台式电脑怎么组装 U大侠分享组装台式机的具体步骤
  15. 硬件设计必备,电子元器件高清矢量图
  16. Android 分享到LINE
  17. 实现表格内容第一行居中,其他行与第一行左对齐
  18. Keras实现两个优化器:Lookahead和LazyOptimizer
  19. SVG动画和CSS转换:复杂的爱情故事
  20. Python绘制某图片(LOL)

热门文章

  1. java 获取当前日期的前一天
  2. Oracle账号过期、被锁
  3. java安装与环境配置(installer方式)
  4. c语言程序设计名片管理系统,c语言课程设计-手机名片管理系统
  5. eclipse关于如何有html和javascript的提示
  6. Xilinx原语ODDR的使用
  7. 两台电脑上的虚拟机相互通信
  8. FMD辉芒微原厂FT61F022A-RB SOP14 ADC/PWM型单片机MCU
  9. 招行信用卡笔试编程题 — 考察树的节点个数C++
  10. 韩国11街店铺批量采集上传