输入一个待编码的字符串,字符串长度小于等于100.
输出这个编码的index
baca
16331
参考最高赞
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
System.out.println(encode(str));
}
public static int encode(String str) {
if (str.equals("a")) {
return 0;
}
if (str.equals("aa")) {
return 1;
}
if (str.equals("aaa")) {
return 2;
}
if (str.equals("aaaa")) {
return 3;
}
int res = 0;
int one,two,three,four;
int mod = 25;
one = mod * mod * mod + mod * mod + mod + 1;
two = mod * mod + mod + 1;
three = mod + 1;
four = 1;
int []arr = new int[4];
arr[0] = one;
arr[1] = two;
arr[2] = three;
arr[3] = four;
int i = 1;
while (i <= str.length()) {
int cnt = Integer.parseInt(String.valueOf(str.charAt(i - 1) - 'a'));
if (i == 1) {
res += cnt * arr[i - 1];
}else {
//此处加一是因为,a = 0,aa = 1,所以除了第一位每一位都要加1
res += cnt * arr[i - 1] + 1;
}
i ++;
}
return res;
}
}
代码很简洁 就是思路不好想 参考一楼的思路
#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);}}}}