PAT (Basic Level) Practise 1021 – 1025 解题报告

1021. 个位数统计 (15)

解题思路: 水题, 利用hash表统计每个数字的个数即可. 下面是AC代码:

#include <map>
#include <iostream>
#include <string>

int main()
{
	std::string strInput;
	std::cin >> strInput;
	std::map<char, int> mapCounts;
	int iLen = strInput.size();
	for(int i = 0; i < iLen; ++i) {
		if(mapCounts.find(strInput[i]) == mapCounts.end())
			mapCounts[strInput[i]] = 1;
		else
			++mapCounts[strInput[i]] ;;
	}
	for(auto it = mapCounts.begin(); it != mapCounts.end(); ++it) {
		std::cout << it->first << ':' << it->second << std::endl;
	}
	return 0;
}

1022. D进制的A+B (20)

解题思路: 水题, 简单的进制转换算法, 不断的求余数即可, 注意A+B可能等于零的这种特殊情况. 下面是AC代码:

#include <iostream>
#include <string>
#include <algorithm>

std::string gao(int iNum, int iRadix)
{
	if(0 == iNum) return "0";
	std::string strResult("");
	while(iNum) {
		strResult.push_back(iNum % iRadix + '0');
		iNum /= iRadix;
	}
	std::reverse(strResult.begin(), strResult.end());
	return strResult;
}

int main()
{
	int A, B, D;
	std::cin >> A >> B >> D;
	if(10 == D) {
		std::cout << A + B << std::endl;
		return 0;
	}
	std::cout << gao(A + B, D) << std::endl;
	return 0;
}

1023. 组个最小数 (20)

解题思路: 如果输入中零的个数是零, 也就是没有零, 那么直接按照从1到9的顺序输出, 如果输入中有0, 那么找到第一个非零的数字, 拿一个出来当做首位, 剩下的数字按照0到9的顺序输出. 下面是AC代码:

#include <iostream>
const int N = 10;

void gao(int cnt[N]) {
	if(0 == cnt[0]) {
		for(int i = 1; i < N; ++i) {
			while(cnt[i]--) std::cout << i;
		}
		return ;
	}
	int idxFirstNonZeroAfterZero = 0;
	while(!cnt[++idxFirstNonZeroAfterZero]) ;
	std::cout << idxFirstNonZeroAfterZero;
	--cnt[idxFirstNonZeroAfterZero];
	for(int i = 0; i < N; ++i) {
		while(cnt[i]--) std::cout << i;
	}
	return ;
}

int main()
{
	int iCounts[N];
	for(int i = 0; i < N; ++i)
		std::cin >> iCounts[i];
	gao(iCounts);
	return 0;
}

1024. 科学计数法 (20)

解题思路: 同”PAT 解题报告 1073. Scientific Notation (20)

1025. 反转链表 (25)

解题思路: 同”PAT 解题报告 1074. Reversing Linked List (25)

Written on March 7, 2014