原文題目

python

# 解題思路:
# 用count數字串裡面每個字母重複幾次
# 重複的次數放到SET裡面,只要SET裡面的個數沒變
# 表示有重複,就不是COOl Word
# 每一次計算完一個字母,就將該字母刪除
# 直到沒有字母就完成了

case = 1  # 計算目前是CASE多少
while True:
    try:  # EOF用的
        casenumber = input()  # 輸入測資數量
        while casenumber == '':  # 會有空白不能直接轉int
            casenumber = input()
        else:  # else表示迴圈正常結束(沒有被break)
            casenumber = int(casenumber)  # 將測資數量改成int

        cool = 0  # 計算有幾個cool word

        while casenumber > 0:  # 輸入字串的迴圈
            casenumber -= 1

            string = input()  # 輸入要判斷的字串
            count = set()  # 開一個SET
            last_count = 0  # 紀錄上次的SET數目

            while len(string) > 0:  # 只要字串裡有字就要進行判斷

                if string.count(string[0]) == len(string) and len(count) == 0:
                    break  # 如果只有一個字母的話就不適COOL WORD

                count.add(string.count(string[0]))  # 將字串第一個字母重複的次數放到SET裡面
                if last_count == len(count):  # 如果SET數目一樣表示有字母重複的次數一樣
                    break
                else:  # 沒有就紀錄這次的重複的數量
                    last_count = len(count)

                string = string.replace(string[0], '')  # 將這次判斷重複的字母刪掉
            else:  # 正常結束表示每個字母重複的次數都一樣
                cool += 1

        print('Case ', end='')  # 照格式輸出
        print(case, end='')
        print(': ', end='')
        print(cool)
        case += 1

    except:  # 有EOF就結束
        break

遇到的問題

1:沒有處理空行

2:沒有處理EOF

3:輸出格式不對,自己使用\b可以,線上測試不行

C++

 

/*
2019/12/28
解題思路
用count數字串裡面每個字母重複幾次
重複的次數放到SET裡面,只要SET裡面的個數沒變
表示有重複,就不是COOl Word
每一次計算完一個字母,就將該字母刪除
直到沒有字母就完成了 
*/ 

#include <iostream>
#include <string>
#include <set>
using namespace std;

int main()
{
	int casenumber=0,c=1,cool,count,ls,flag=0;
	string str;
	char sf;
	set <int> s;
	
	while(cin>>casenumber)//輸入有幾組測資 
	{
		cool=0;//COOL歸零 
		while(casenumber--)
		{
			cin>>str;//輸入測資字串 
			
			s.clear();//各種歸零 
			ls=0;
			flag=0;
			
			while(str.length()>0) 
			{//判斷字母重複幾次的迴圈
				count=0;//計數重複次數 
				sf=str[0];//紀錄第一個字母 
				
				for(int j=0;j<str.length();j++) 
				{//一字一字判斷是否一樣
					if(sf==str[j])//找到一樣的字母 
					{
						count++;//重複次數+1 
						str.erase(j,1);//刪掉現在的字母 
						j--;//因為字母被刪除,j要減一
					}
				}
				
				s.insert(count);//將重複的值給set 
				
				if(ls==s.size()||(ls==0&&str.length() ==0))
				{//如果set的size一樣,或是只有一個字母,表示字串不是COOL 
					flag=1;
					break;
				}
				
				ls=s.size();//紀錄這次的size,以供下次比較使用 
			}
			
			if(flag==0)//沒事情,字串就是cool; 
			{
				cool++;
			}
		}
		
		cout<<"Case "<<c<<": "<<cool<<endl;//輸出 
		c++;//下筆測資 
	}
	return 0;
}
 

遇到的問題

1:一開始用兩個for迴圈,因為會刪除字,所以外層迴圈有跳過問題

2:刪除字串,J沒有減一

3:變數ls沒有歸零,歸零要完整

創作者介紹
創作者 程式道路,必為豐富 的頭像
豪CO

程式道路,必為豐富

豪CO 發表在 痞客邦 留言(0) 人氣( 641 )