C++简单题解:
使用一个dp数组表示该位置的数需要右移的位数,用vector保存需要放置*的位置。

#include<iostream>
#include<cstring>
#include<vector>
using namespace std;

bool isNum(char c)
{
    if(c>='0'&&c<='9')
        return true;
    return false;
}
int main()
{
    string s;
    while(cin>>s)
    {
        int n=s.length();
        int dp[n];
        for(int i=0; i<n; i++)
            dp[i]=0;
        vector<int> v;
        if(isNum(s[0]))//首个是数字
        {
            dp[0]=1;
            v.push_back(0);
        }
        for(int i=1; s[i]!='\0'; i++)
        {
            if( isNum(s[i]) && isNum(s[i-1]) )//aa
                dp[i]=dp[i-1];
            else if(!isNum(s[i]) && !isNum(s[i-1]))//12
                dp[i]=dp[i-1];
            else              //  a1,1a
            {
                 dp[i]=dp[i-1]+1;
                 v.push_back(i+dp[i-1]);
            }
        }
        char c[n+2+dp[n-1]];
        for(int i=0; i<n; i++)
        {
            if(dp[i]==0)
                c[i]=s[i];
            else 
                c[i+dp[i]]=s[i];
        }
        for(int i=0; i<v.size(); i++)
            c[v[i]]='*';
        if(!isNum(s[n-1]))//结尾不是数字
            c[n+dp[n-1]]='\0';
        else
        {
            c[n+dp[n-1]]='*';
            c[n+1+dp[n-1]]='\0';
        }
        cout << c <<endl;
    }
    return 0;
}