输入一个待编码的字符串,字符串长度小于等于100.
输出这个编码的index
baca
16331
代码很简洁 就是思路不好想 参考一楼的思路
#include <iostream> #include <string> using namespace std; const int arr[] = {16276, 651, 26, 1}; int main(){ string s; cin>>s; int ans = 0; for(int i = 0; i < s.length(); i++){ int if_1 = 1; if(i == 0) if_1 = 0; ans += (s[i]-'a') * arr[i] + if_1; } printf("%d\n", ans); return 0; }
举例:cbd
由于是从1到4位的编码,分析如下:
一位的情况:c-a+1
二位的情况:(c-a)*25+(b-a)+1
三位的情况:(c-a)*25*25+(b-a)*25+(d-a) 此处不用+1,因为编码从0开始,且也刚好不能取cbd
四位的情况:三位的数量*25:(c-a)*25*25*25+(b-a)*25*25+(d-a)*25
最后的编码就是上面四种情况的总数,通项已经被推出:
temp=temp*25+(str[i]-'a');由于该例子是3位的,所以一位和二位的情况,需要在末尾+1
用中间变量temp存储中间数据,可提高性能
#include <iostream> #include <algorithm> using namespace std; int main() { string str; while(cin>>str) { int strLength=str.length(); int index=0; int temp=0; for(int i=0;i<strLength;++i) { temp=temp*25+(str[i]-'a'); if(i<strLength-1) index+=temp+1; else index+=temp; } for(int i=strLength;i<4;++i) { temp=temp*25; index+=temp; } cout<<index<<endl; } return 0; }
//AC代码: #include<string> #include<vector> #include<iostream> #include<algorithm> using namespace std; string s=""; vector<string> d; void dfs(int step){ if(step>=4) return; else for(int i=0;i<25;i++){ string tmp=s; char t='a'+i; s+=t,d.push_back(s); dfs(step+1),s=tmp; } } int main(){ dfs(0); cin>>s; int w=lower_bound(d.begin(),d.end(),s)-d.begin(); printf("%d\n",w>=d.size()?-1:w); }//用dfs把所有的串打个表,再二分去搜
//一个递归 #include<iostream> #include<string> #include<math.h> using namespace std; int nums_less_than(string s, int digits){ if(s.size()==1&&digits==1) returns[0]-'a'; if(s.size()==1&&digits>1) return(s[0]-'a')*pow(25, digits-1); if(s.size()>1&&digits==1) returns[0]-'a'+1; return (s[0]-'a')*pow(25, digits-1)+nums_less_than(s.substr(1), digits-1); } int main(){ string s; int index=0; cin>>s; for(int i=1;i<=4;) index+=nums_less_than(s, i++); cout<<index; return 0; }
s = list(input()) dic = dict(zip(list("abcdefghijklmnopqrstuvwxy"), range(25))) n = len(s) index = n - 1 try: index += dic[s[0]] + dic[s[0]] * 25 + dic[s[0]] * 25 ** 2 + dic[s[0]] * 25 ** 3 index += dic[s[1]] + dic[s[1]] * 25 + dic[s[1]] * 25 ** 2 index += dic[s[2]] + dic[s[2]] * 25 index += dic[s[3]] except IndexError: pass print(index)
count +=1
#include <iostream>
#include <math.h>
using namespace std;
int main(){
string s;
while(cin>>s){
int result=0;
for(int i=0;i<s.size();i++){
int temp=s[i]-'a';
int cnt=i;
while(cnt<4){
result+=pow(25,3-cnt)*temp;
cnt++;
}
}
// cout<<result<<endl;
result+=s.size()-1;
cout<<result<<endl;
}
return 0;
}
我以为考的是 字符组合问题呢?字符组合的答案如下。#include <iostream>
/* AC 代码,+1主要考虑第二、三、四位可能没有字符的情况,25代表这一位可能取的情况有25种*/ #include<iostream> #include<string> using namespace std; int main() { string str; cin>>str; int len=str.size(),num=0; if(len>=1) num += (str[0] - 'a')*(1 + 25 * (1 + 25 * ( 1 + 25))); if(len>=2) num += (str[1] - 'a')*(1 + 25 * (1 + 25)) + 1; if(len>=3) num += (str[2] - 'a')*(1 + 25) + 1; if(len>=4) num += str[3] - 'a' + 1; cout << num << endl; return 0; }
#include <iostream> #include <string> #include <cmath> using namespace std; inline int p(int n){ long rsl=0;int base=25; while(n>=0){ rsl+=pow(base,n); n--; } return rsl; } int main(){ string s; int weight[4]={p(3),p(2),p(1),p(0)}; while(cin>>s){ string::iterator it; int* p=weight; long idx=0; for(it=s.begin();it!=s.end();++it){ idx+=((int)(*it)-(int)'a')*(*p); if(it!=s.begin()) idx++; p++; } cout<<idx<<endl; } return 0; }
char s[105];
scanf("%s", s); int n = strlen(s);
long long ans = n - 1;
n = 4; // 没有这一句就是对任意长度的编码求index
for (int i = 0; i < n; ++i) {
int x = s[i] - 'a';
if (x > 0) {
for (int j = 0; j < n - i; ++j)
ans += x * pow(25, j);
}
}
cout << ans << endl;
#include <iostream> #include <cstring> int main() { char buf[101]; scanf("%s", buf); int len = strlen(buf); int h = 0; while (len < 4) { buf[len] = 'a'; ++len; ++h; } int index = 0; int help[4] = {1, 26, 651, 16276}; for (int i = 0; i < len; ++i) { index += (buf[i] - 'a') * help[len-1-i] + 1; } std::cout << index-1-h; }
importjava.util.*;publicclassMain{publicstaticvoidmain(String[] args) {Scanner scanner = newScanner(System.in);while(scanner.hasNext()) {String string = scanner.nextLine();String alphabet = "abcdefghijklmnopqrstuvwxy";TreeMap<String, Object> map = newTreeMap<String, Object>();// 1位的for(inti = 0; i < alphabet.length(); i++) {map.put(String.valueOf(alphabet.charAt(i)), 0);}// 2位的for(inti = 0; i < alphabet.length(); i++) {for(intj = 0; j < alphabet.length(); j++) {map.put(String.valueOf(alphabet.charAt(i)) + String.valueOf(alphabet.charAt(j)), 0);}}// 3位的for(inti = 0; i < alphabet.length(); i++) {for(intj = 0; j < alphabet.length(); j++) {for(intm = 0; m < alphabet.length(); m++) {map.put(String.valueOf(alphabet.charAt(i)) + String.valueOf(alphabet.charAt(j))+String.valueOf(alphabet.charAt(m)), 0);}}}// 4位的for(inti = 0; i < alphabet.length(); i++) {for(intj = 0; j < alphabet.length(); j++) {for(intm = 0; m < alphabet.length(); m++) {for(intn = 0; n < alphabet.length(); n++) {map.put(String.valueOf(alphabet.charAt(i)) + String.valueOf(alphabet.charAt(j))+String.valueOf(alphabet.charAt(m))+String.valueOf(alphabet.charAt(n)), 0);}}}}Object[] objects=map.keySet().toArray();for(inti=0;i<objects.length;i++){if(string.equals(objects[i]))System.out.println(i);}}}}