首页 > 试题广场 >

已知字母序列【d, g, e, c, f, b, o, a】

[问答题]
已知字母序列【d, g, e, c, f, b, o, a】,请实现一个函数针对输入的一组字符串 input[] = {"bed", "dog", "dear", "eye"},按照字母顺序排序并打印。
一个hash表加上简单的排序即可:构建一个按照【d, g, e, c, f, b, o, a】中元素的位置大小的hash数组,字符越在前面对应的hash值越大,然后比较排序即可:
#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;
}

发表于 2015-09-10 00:50:13 回复(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(); }

编辑于 2015-09-14 11:42:02 回复(0)
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]+",");
			}
		}
	}
}


发表于 2015-09-11 11:58:44 回复(0)
先写一个按照字母序列顺序比较的函数。然后每个字符串排序,先比较长度,短的在前面,长的在后面,长度相等的逐个字母比较

发表于 2015-09-09 22:40:32 回复(0)