#include<iostream> using namespace std; int compare(char *s1,char *s2,int *hash) { int len1=strlen(s1); int len2=strlen(s2); for(int i=0,j=0;i<len1&&j<len2;++i,++j) { if(hash[s1[i]]<hash[s2[j]]) return 1; else if(hash[s1[i]]>hash[s2[j]]) return -1; else continue; } }
int main() { char *s[4]={"bed","dog","dear","eye"}; char *p="dgecfboa"; //构建一个按照p中元素的位置大小的hash数组,字符越在前面对应的hash值越大 int count=0; int hash[521]={0}; while(*p!='\0') hash[*p++]=++count; //排序 for(int i=0;i<3;++i) { int max=i; for(int j=i+1;j<4;++j) { if(compare(s[max],s[j],hash)==-1) { max=j; } } char *temp=s[i]; s[i]=s[max]; s[max]=temp; } for(int j=0;j<4;j++) printf("%s ",*(s+j)); return 0;
}
解题思路:将待排序字符串存入vector<string>strArry中,然后使用sort对strArry按字符串长度由小到大排序,sort中的比较方法为compareStrLen。再使用sort对strArry按给定的字符优先级排序,排序方法为 compareCharPriority。findIndex用来查找待排序字符串首字符在给定字符优先级中的位置。 #include <QtCore/QCoreApplication> #include <iostream> #include <algorithm> #include <vector> using namespace std; string charPriority = "dgecfboa"; //确定的字符优先级
//将字符串按从大到小顺序排序 bool compareStrLen(const string &str1, const string &str2) { return str1.length() > str2.length(); } //查找待排序字符串首字母在charPriority的位置 int findIndex(char ch) { return charPriority.find(ch); }
//按charPriority中的字符顺序排序 bool compareCharPriority(const string &str1, const string &str2) { return findIndex(str1[0]) < findIndex(str2[0]); }
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); string str[] = {"bad", "dog", "dear", "eye"}; //加入待排序字符串 vector<string> strArry(str,str+sizeof(str)/sizeof(str[0])); //按字符串长度由大到小排序 sort(strArry.begin(),strArry.end(),compareStrLen); //按charPriority的优先级排序 sort(strArry.begin(),strArry.end(),compareCharPriority); //输出已经排序好的字符串 for (vector<string>::size_type i = 0; i < strArry.size(); ++i) { cout << strArry[i] << endl; } return a.exec(); }
package Qunar; import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; import java.util.Map; /** * 已知字母序列【d, g, e, c, f, b, o, a】, * 请实现一个函数针对输入的一组字符串 input[] = {"bed", "dog", "dear", "eye"}, * 按照字母顺序排序并打印。 * @author xia *思路: * 要按照给定的字符顺序进行排序,1.首先将字符装入到哈希表中,并给出相应的值 * 2.使用Arrays的sort方法,重写compare方法 * 在方法中,获取字符串中每个字符在哈希表中对应的值 * 进行值相减 * 如果相减结果为0,说明两个字符是相同的,那么继续比较下一个字符 * 否则返回相减的结果 * 如果两个字符串的每个字符都相等,那么返回两个字符串的长度差 */ public class SortForString { /** * 排序方法 * @param array */ public void sort(String [] array){ //判断传入的数组是否为空 if(array==null || array.length<0){ return; } final Map<Character,Integer> map = new HashMap<Character, Integer>(); //将给定的字符装入到map集合中 map.put('d', -8); map.put('g', -7); map.put('e', -6); map.put('c', -5); map.put('f', -4); map.put('b', -3); map.put('o', -2); map.put('a', -1); //对传入的数组使用Arrays工具类进行排序,重写compare方法 Arrays.sort(array, new Comparator<String>() { @Override public int compare(String str1, String str2) { //遍历字符串,对每个字符进行排序,排序的规则是: //如果获取的字符在我们定义的字符序列中,就按照对应的value排序,如果要排序的字符不在 //我们定义的字符中,就按照该字符的ascll进行排序 for(int i=0;i<str1.length()&&i<str2.length();i++){ Integer a=map.get(str1.charAt(i)); int a1=a!=null?a:str1.charAt(i); Integer b=map.get(str2.charAt(i)); int b1=b!=null?b:str2.charAt(i); if(a1==b1) continue; else return a1-b1; } //如果要比较的字符全部都相等,则按字符串的长度排序 return str1.length()-str2.length(); } }); } /** * 测试方法 * @param args */ public static void main(String[] args) { String[] array={"bed", "dog", "dear", "eye"}; SortForString s = new SortForString(); s.sort(array); //遍历数组,查看结果 for(int i=0;i<array.length;i++){ if(i==array.length-1){ System.out.print(array[i]+"]"); }else if(i==0){ System.out.print("["+array[i]+","); } else{ System.out.print(array[i]+","); } } } }
先写一个按照字母序列顺序比较的函数。然后每个字符串排序,先比较长度,短的在前面,长的在后面,长度相等的逐个字母比较